1

我正在使用 GCDWebServer 将我的 iPhone 上的图片分享到本地网络上的其他设备。

我试图在我自己的块中调用 GCDWebServerCompletionBlock 但我的应用程序崩溃没有任何日志但 GCDWebServerConnection 上的“信号 SIGABRT”:

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?

4

2 回答 2

0

发生崩溃是因为您在调试模式下构建 GCDWebServer 并且它报告内部不一致。您很可能completionBlock()多次调用,这是不允许的。对于每个请求的每个响应,它必须被调用一次且恰好一次。

于 2019-01-05T20:13:57.280 回答
0

您正在使用同步处理程序,因此您必须在函数返回时从它返回响应。不这样做是程序员错误,这就是您的应用程序中止的原因。

看起来您想要的是一个异步处理程序,它允许您稍后返回响应。README有关更多信息和示例,请参阅 GCDWebServer 的“异步 HTTP 响应”部分。

于 2016-10-29T15:56:32.353 回答