在我的VC1中,我运行了从在线博客中获取的代码:
dispatch_async(dispatch_get_main_queue(), ^{
NSURLSessionDataTask* dataTask =
[session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
[self.delegate didReceiveResponse:response data:data error:error];
}];
[dataTask resume];
});
我的问题是:
didReceiveResponse
在主线程中运行以更新UI。其他所有内容都应该在后台运行。
一点点解释都很有用。
答案 0 :(得分:0)
你的代码全部由内而外。您需要创建后台队列来运行任务,并指定应在主队列上运行完成处理程序:
session = [NSURLSession sessionWithConfiguration:someConfiguration delegate:someDelegate delegateQueue:[NSOperation mainQueue]];
...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURLSessionDataTask* dataTask =
[session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
[self.delegate didReceiveResponse:response data:data error:error];
}];
[dataTask resume];
});
上面的代码设置了会话,因此在主队列上调用完成处理程序,然后在后台创建并恢复数据任务。
如上所述,您指定要创建数据任务并在主队列上启动,并且您没有指示完成处理程序的运行位置。