2016-10-27 41 views
0

我正在使用GCDWebServer將圖片從我的iPhone共享到本地網絡上的其他設備。GCDWebServer響應與completionBlock從另一個塊調用

我想對GCDWebServerConnection致電GCDWebServerCompletionBlock我自己的塊,但我的應用程序崩潰裏面沒有任何日誌,但「信號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我自己的塊內?

回答

0

您正在使用同步處理程序,因此您必須在函數返回時從它返回響應。不這樣做是程序員錯誤,這就是爲什麼你的應用程序中止。

它看起來像你想要的是一個異步處理程序,它允許您稍後返回響應。有關更多信息和示例,請參閱GCDWebServer README的「異步HTTP響應」部分。

+0

沒有錯,我使用異步處理程序。這就是爲什麼方法簽名中有一個完成塊。我正在頂層使用:[server addDefaultHandlerForMethod:@「GET」 requestClass:[GCDWebServerRequest class] asyncProcessBlock:^(GCDWebServerRequest * request,GCDWebServerCompletionBlock completionBlock){_Strong typeof(weakSelf)strongSelf = weakSelf; [strongSelf handleMediaRequest:request completion:completionBlock]; }]; – tza

+0

我的不好,我讀的代碼太快了。你可以在你的問題中添加導致「GWS_DCHECK(_responseMessage == NULL)」的堆棧跟蹤嗎? – Pol