![](/img/trans.png)
[英]dispatch_sync dispatch_get_main_queue causes a semaphore_wait_trap
[英]dispatch_sync(dispatch_get_main_queue() UI weirdness
這適用於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作為一個例子,這也適用於包含滾動視圖的任何視圖(所以到目前為止我已經測試過)。 這是一個錯誤嗎? 其他人是看到這個還是僅僅是我,還有另一種首選方式嗎?
問題是您正在阻塞主線程,因為main_queue是一個串行調度隊列。 主線程無法運行,因為它在runModal
方法中被阻止。
在這里討論之后,解決方案是使用beginWithCompletionHandler:
相反,我已經驗證了它的工作:
//[op runModal];
[op beginWithCompletionHandler:^(NSInteger result) {
NSLog(@"Done: %lu", (unsigned long)result);
}];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.