在异步连接完成处理程序中使用dispatch_async进行死锁的可能性

时间:2014-01-27 19:28:28

标签: ios objective-c cocoa-touch grand-central-dispatch deadlock

dispatch_async()的异步请求完成处理程序中的主队列使用NSURLConnection是否可能导致死锁?

NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest:request
                                   queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {
         if (!error) {
             dispatch_async(dispatch_get_main_queue(), ^{
                 // Alsways perform such code on the main queue/thread
                 /// At this point I update the UI
             });

         }
     }];

如果是,我该如何解决?

3 个答案:

答案 0 :(得分:2)

dispatch_async不会出现死锁。它不会阻止调用队列。

答案 1 :(得分:2)

没有理由为什么你的代码应该死锁。但可能存在误解 关于queue参数。这是完成块所在的队列 执行,而不是用于在后台加载数据的队列。

sendAsynchronousRequest总是将数据加载到后台队列中,并且不会阻塞主线程。 因此,要在主线程上执行完成处理程序,您不需要 创建操作队列,您可以将代码简化为:

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {
     // This is executed on the main thread.
     // Update UI elements ...
     if (error) {

     }
 }];

答案 2 :(得分:2)

看起来您正在尝试从主队列中运行NSURLConnection,然后更新主队列上的UI。这是一个好主意。但是你可以通过这种方法免费获得所有这些。 queue参数表示应该分派完成块的位置......

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

    if (!error) {
        // this will run on the main queue because of the queue param
        // update the ui
    }
}];