簡體   English   中英

dispatch_sync(dispatch_get_main_queue()UI古怪

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM