gpt4 book ai didi

objective-c - dispatch_sync(dispatch_get_main_queue() UI 怪异

转载 作者:搜寻专家 更新时间:2023-10-30 20:09:00 26 4
gpt4 key购买 nike

这是针对 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 打开时,各种奇怪的事情都在发生。 ScrollView 滚动非常不稳定,如果有的话,目录没有正确列出。我只是在这里使用 NSOpenPanel 作为示例,任何包含 ScrollView 的 View 也会发生这种情况(到目前为止我已经测试过了)。这是一个错误吗?是其他人看到了还是只有我看到了,还有其他首选方式吗?

最佳答案

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

讨论后here ,解决方案是改用 beginWithCompletionHandler:,我已经验证它可以工作:

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

关于objective-c - dispatch_sync(dispatch_get_main_queue() UI 怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com