Ответ GCDWebServer с завершением блока, вызванного из другого блока
Я использую GCDWebServer для обмена фотографиями с моего iPhone на других устройствах в локальной сети.
Я пытаюсь вызвать GCDWebServerCompletionBlock внутри моего собственного блока, но мое приложение вылетает без каких-либо журналов, но "сигнализирует SIGABRT" на GCDWebServerConnection:
GWS_DCHECK(_responseMessage == NULL);
Тем не менее, если я возвращаю ответ за пределами моего блока, все работает нормально.
Вот мой код:
-(void)handleMediaRequest:(GCDWebServerRequest *)request completion:(GCDWebServerCompletionBlock)completionBlock {
//...
URLParser *parser = [[URLParser alloc] initWithURLString:url];
NSString *photoId = [parser valueForVariable:@"id"];
[[PhotoLibraryManager photoLibraryManager] getPhotoWithId:photoId completionBlock:^(UIImage *image) {
NSData *data = UIImageJPEGRepresentation(image, 0.70);
completionBlock([GCDWebServerDataResponse responseWithData:data contentType:@"application/octet-stream"]);
} failureBlock:^(NSError *error) {
completionBlock([GCDWebServerDataResponse responseWithStatusCode:404]);
}];
}
Как вызвать GCDWebServerCompletionBlock внутри моего собственного блока?
1 ответ
Сбой происходит из-за того, что вы собираете GCDWebServer в режиме отладки, и он сообщает о внутренней несогласованности. Вы, скорее всего, звоните completionBlock()
более одного раза, что не допускается. Он должен вызываться один раз и ровно один раз для каждого ответа на каждый запрос.
Вы используете синхронный обработчик, поэтому при возврате функции вы должны получить от него ответ. Это не ошибка программиста, и поэтому ваше приложение прерывается.
Похоже, что вы хотите, это асинхронный обработчик, который позволяет вам вернуть ответ позже. См. Раздел "Асинхронные HTTP-ответы" в GCDWebServer. README
для получения дополнительной информации и примеров.