dispatch_sync(dispatch_get_main_queue()UI古怪

时间:2014-09-05 18:14:07

标签: objective-c macos cocoa objective-c-blocks grand-central-dispatch

这适用于MacOS而非iOS。

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

dispatch_sync(dispatch_get_main_queue(), ^{
    //do UI stuff
});

几乎是在主线程/队列上执行UI工作的方式,这似乎适用于iOS。 MacOS似乎是一个不同的故事。 试试这个简单的例子

- (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作为示例,这也适用于任何包含滚动视图的视图(所以到目前为止我已经测试过)。 这是一个错误吗? 其他人是看到这个还是仅仅是我,还有另一种首选方式吗?

1 个答案:

答案 0 :(得分:3)

问题是你正在阻塞主线程,因为main_queue是一个串行调度队列。主线程无法运行,因为它在runModal方法中被阻止。

在讨论here之后,解决方案是使用beginWithCompletionHandler:代替,我已经验证了这项工作:

//[op runModal];
[op beginWithCompletionHandler:^(NSInteger result) {
    NSLog(@"Done: %lu", (unsigned long)result);
}];