这是针对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作为示例,这也发生在任何包含滚动视图的视图中(所以我到目前为止已经测试过了)。这是一个bug吗?是其他人看到了这一点,还是只有我看到了这一点,还有其他首选的方法吗?
发布于 2014-09-06 02:48:01
问题是您阻塞了主线程,因为main_queue是串行分派队列。主线程无法运行,因为它在runModal方法中被阻塞。
在讨论here之后,解决方案是使用beginWithCompletionHandler:,我已经验证了它是有效的:
//[op runModal];
[op beginWithCompletionHandler:^(NSInteger result) {
NSLog(@"Done: %lu", (unsigned long)result);
}];https://stackoverflow.com/questions/25691694
复制相似问题