我使用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 ?
您正在使用同步处理程序,因此当函数返回时必须从它返回响应。不这样做是程序员的错误,这就是为什么你的应用程序中止。
看起来您想要的是一个异步处理程序,它允许您在稍后的时间返回响应。查看GCDWebServer README
的"异步HTTP响应"小节了解更多信息和示例。
崩溃发生,因为你正在构建GCDWebServer在调试模式,它报告内部不一致。您很可能调用completionBlock()
不止一次,这是不允许的。对于每个请求的每个响应,它必须被调用一次,并且只调用一次。