对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
});
}
}];
如果是,我该如何解决?
答案 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
}
}];