sendAsynchronousRequest和completionHandler返回方法
问题描述:
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;
}];
}
答
当你说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
}