请考虑以下代码:
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t myGroup = dispatch_group_create();
dispatch_group_async(myGroup, myQueue, ^{
NSLog(@"First block of code");
});
dispatch_group_async(myGroup, myQueue, ^{
NSLog(@"Second block of code");
});
dispatch_group_async(myGroup, myQueue, ^{
dispatch_sync(dispatch_get_main_queue(), ^{ //problem here
dispatch_time_t myTime = dispatch_time(DISPATCH_TIME_NOW, 10ull * NSEC_PER_SEC);
dispatch_after(myTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Third block of code work");
});
});
});
dispatch_group_wait(myGroup, DISPATCH_TIME_FOREVER);
NSLog(@" All done ?");
问题出在dispatch_sync(dispatch_get_main_queue(), ^{
当我执行dispatch_async(dispatch_get_main_queue(),^ {时,它应能正常工作。进行同步时,它阻塞了主线程10秒钟,模拟了“辛苦的工作”。但是,不幸的是,它不起作用。我想知道为什么?
我想要的是:dispatch_sync阻止主线程仅10秒钟,然后继续执行。
实际上发生了什么:调度同步会阻止整个应用程序进一步执行。
如果该代码在主事件循环上运行,则dispatch_group_wait()
它将阻塞主队列。这会阻止同步执行主队列上的任何块,并导致死锁。
您可以通过暂停进入调试器来验证这一点。您可能会在等待调用时看到主线程/队列被阻塞,而在dispatch_sync上阻塞了辅助线程/队列。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句