在NSURLConnection中使用时,Mainqueue可以执行后台任务吗?

时间:2014-06-06 05:34:37

标签: ios iphone ios7

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];
}];

1 个答案:

答案 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]; }];
    

使用AFNetworking framework

的另一种选择,更安全,更有效