首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dispatch_sync(dispatch_get_main_queue() UI怪异

dispatch_sync(dispatch_get_main_queue() UI怪异
EN

Stack Overflow用户
提问于 2014-09-06 02:14:07
回答 1查看 358关注 0票数 3

这是针对MacOS的,不是针对iOS的。

如果您在GCD队列上运行代码

代码语言:javascript
复制
dispatch_sync(dispatch_get_main_queue(), ^{
    //do UI stuff
});

几乎就是在主线程/队列上做UI的方法,这在iOS上似乎工作得很好。MacOS似乎是另一回事。在一个简单的例子中试试这个

代码语言:javascript
复制
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // So my app is doing some background stuff
        // and I need a file from the user so

        // code blah blah code

        dispatch_sync(dispatch_get_main_queue(), ^{
            NSOpenPanel *op = [NSOpenPanel openPanel];

            [op runModal];
        });

        // resume code blah blah code
    });
}

当NSOpenPanel打开的时候,各种各样的怪事正在上演。滚动视图的滚动非常不稳定,如果有的话,并且目录不能正确列出。我只是在这里使用NSOpenPanel作为示例,这也发生在任何包含滚动视图的视图中(所以我到目前为止已经测试过了)。这是一个bug吗?是其他人看到了这一点,还是只有我看到了这一点,还有其他首选的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2014-09-06 02:48:01

问题是您阻塞了主线程,因为main_queue是串行分派队列。主线程无法运行,因为它在runModal方法中被阻塞。

在讨论here之后,解决方案是使用beginWithCompletionHandler:,我已经验证了它是有效的:

代码语言:javascript
复制
//[op runModal];
[op beginWithCompletionHandler:^(NSInteger result) {
    NSLog(@"Done: %lu", (unsigned long)result);
}];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25691694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档