Ответ 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 для получения дополнительной информации и примеров.

Другие вопросы по тегам