dispatch_sync不适用于主队列

叶夫根尼·克莱班(Evgeniy Kleban)

请考虑以下代码:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章