1)当我们在NSURLConnection中使用mainQueue进行sendasynchronousrequest时,如何通过在后台运行获得响应?因为mainqueue仅用于更新UI。对于EX:
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil)
[delegate receivedData:data];
else if ([data length] == 0 && error == nil)
[delegate emptyReply];
else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
[delegate timedOut];
else if (error != nil)
[delegate downloadError:error];
}];
答案 0 :(得分:1)
当你说mainQueue用于更新UI时,只是严格来说不正确。
确切的一点是,mainQueue用于更新UI,因此开发人员避免在mainQueue上执行任何其他任务,以免在UI上引入延迟。它并非完全被禁止。
但是,在mainQueue上执行像网络请求这样的异步任务实际上是一个坏主意,因为它会引入无限延迟,完全破坏UI的流畅性
为了不阻止你的mainQueue你应该这样执行你的请求:
创建自己的应用程序操作队列
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
然后在您需要的任何地方重复使用operationQueue
来执行网络请求
[NSURLConnection sendAsynchronousRequest:urlRequest queue:operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if ([data length] > 0 && error == nil)
[delegate receivedData:data];
else if ([data length] == 0 && error == nil)
[delegate emptyReply];
else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
[delegate timedOut];
else if (error != nil)
[delegate downloadError:error]; }];