0

completionHandler完成时如何返回数据?这个方法我试过,但它显示了一个错误:sendAsynchronousRequest和completionHandler返回方法

- (NSData *)ReturnDataFromUrl{ 

    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com"]]; 

    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

     return data; 

    }]; 
} 

enter image description here

回答

4

当你说return data;,你实际上是试图返回data来完成模块的调用者 - 这是行不通的。

由于您使用的是异步方法,因此无法将块中收到的数据返回到您启动网络操作的方法中。当调用该块中的代码时,系统很长时间执行该方法。

你需要做的是建立一个委托系统 - 如果这是一个辅助类,你可以添加一个协议,包括像didFinishLoadingStuff:(NSData *)stuff这样的方法。

你会再改

- (NSData *)ReturnDataFromURL{...} 

要像

- (void)getDataFromUrlWithDelegate:(NSObject<StuffGetterProtocol> *)delegate{...} 

,取而代之的return data;,你会说:

[delegate didFinishLoadingStuff:data]; 

当然和实施任何委托方法你打电话给的这个课程来自:

- (void)didFinishLoadingStuff:(NSData *)stuff 
{ 
    //do something with stuff 
}