dispatch_async函数的“async”意味着“非同步”,将指定的Block非同步的追加到指定的Dispatch Queue中,不用等待Block处理执行结束。
dispatch_sync函数的“sync”意味着“同步”,将指定的Block同步的追加到指定的Dispatch Queue中,等待Block处理执行结束,“等待”意味着当前线程停止,也就是说,执行dispatch_sync函数所在的Dispatch Queue的线程停止,等待dispatch_sync函数的Block处理在第一个参数Dispatch Queue中的线程中执行结束。
// 执行Main Dispatch Queue时,使用Concurrent Dispatch Queue进行处理,处理结束后立即使用所得到的结果。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
NSLog(@"处理");
});
说明:dispatch_sync函数所在的Dispatch Queue就是默认的Main Dispatch Queue。
dispatch_sync函数使用简单,也很容易引起死锁问题。
// 例子1
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"处理");
});
// 例子2
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"处理");
});
});
说明:两个例子中,dispatch_sync函数所在Main Dispatch Queue的主线程停止,等待Block处理在 Main Dispatch Queue的主线程中执行结束,死锁。
Serial Dispatch Queue也会引起死锁的问题。
dispatch_queue_t queue = dispatch_queue_create("com.example.gdc.mySerialDispatchQueue", NULL);
dispatch_async(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"处理");
});
});
说明:dispatch_sync所在的Serial Dispatch Queue的线程停止,等待追加的Block处理在Serial Dispatch Queue的线程中执行结束,Serial Dispatch Queue只有一个线程,死锁。
总结:dispatch_sync函数所在的Dispatch Queue,不能和其第一个参数Dispatch Queue是同一个Serial Dispatch Queue。
网友评论