从另一个块

时间:2016-10-27 12:50:58

标签: objective-c gcdwebserver

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

我正在尝试在我自己的块中调用GCDWebServerCompletionBlock,但是我的应用程序在没有任何日志的情况下崩溃,但在GCDWebServerConnection上发出“signal 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?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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