0
__block int x = 5; 
dispatch_queue_t abe = dispatch_queue_create([[NSString stringWithFormat:@"abe'sQueue.%@", self] UTF8String], NULL); 
dispatch_sync(abe, ^{ 
    NSLog(@"%@", [self returnSomething]); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     x = 20; 
    }); 
}); 

NSLog(@"%d", x); 

即使主線程的嵌套回調異步更改值,上面的總是會導致5是'x'的記錄值。任何想法,我要去哪裏錯了?從調度隊列主線程嵌套回調不工作?

回答

2

您正在異步調度到主隊列。該塊已排隊,並且dispatch_async()立即返回。假設代碼的其餘部分在主線程上運行,那麼異步入隊的塊將不會運行,直到下一次通過主事件循環時纔會運行,直到上面的所有代碼執行完畢纔會發生。

爲了以這種方式設置標量變量,沒有理由對主線程調度dispatch_async()。直接設置變量(因爲主線程在dispatch_sync()上被阻塞。

+0

感謝您的解釋。一個快速後續問題:如果有多個這樣的隊列 - 並且從iOS開發庫取得它們可以同時運行 - 我仍然需要包含嵌套的'dispatch_async'函數,因爲肯定有些隊列會運行在不同的線程上嗎? – user1945991

+0

對於標量?除了處理「正常」併發問題外,不需要另外處理。對於非標量或採取操作可能會導致UI更新?是的 - 您可能需要重新發送回主隊列。取決於情況。當然,任何時候您都可以異步執行任何操作,您必須處理如何協調價值變化。 – bbum