这适用于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作为示例,这也适用于任何包含滚动视图的视图(所以到目前为止我已经测试过)。 这是一个错误吗? 其他人是看到这个还是仅仅是我,还有另一种首选方式吗?
答案 0 :(得分:3)
问题是你正在阻塞主线程,因为main_queue是一个串行调度队列。主线程无法运行,因为它在runModal
方法中被阻止。
在讨论here之后,解决方案是使用beginWithCompletionHandler:
代替,我已经验证了这项工作:
//[op runModal];
[op beginWithCompletionHandler:^(NSInteger result) {
NSLog(@"Done: %lu", (unsigned long)result);
}];