我有一個方法,我添加到我創建的GCD隊列(所以它是一個串行隊列),然後運行它的異步。從那段代碼中,我派遣到主隊列,當派發到主隊列的代碼塊完成時,我將一個BOOL標誌設置爲YES,這樣我在代碼中進一步下來可以檢查這個條件是否爲YES那麼我可以繼續下一個方法。下面是短代碼:等待的條件繼續
dispatch_queue_t queue = dispatch_queue_create("ProcessSerialQueue", 0);
dispatch_async(queue, ^{
Singleton *s = [Singleton sharedInstance];
dispatch_sync(dispatch_get_main_queue(), ^{
[s processWithCompletionBlock:^{
// Process is complete
processComplete = YES;
}];
});
});
while (!processComplete) {
NSLog(@"Waiting");
}
NSLog(@"Ready for next step");
然而,這是不行的,因爲dispatch_sync從來都不是能夠在主隊列運行代碼。這是因爲我在主隊列上運行一個while循環(使其處於繁忙狀態)?
但是,如果我改變而循環的實現這樣:
while (!processComplete) {
NSLog(@"Waiting")
NSDate *date = [NSDate distantFuture];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:date];
}
它工作無故障。這是這種情況下可接受的解決方案嗎?我可以做任何其他首選的方式嗎? NSRunLoop
做什麼樣的魔術?我需要更好地理解這一點。
所以,如果我不是要從主隊列(主線程)進行回調,我可以使用派遣信號量(http://stackoverflow.com/q/4326350/294661)或甚至使用我的解決方案(無需手動調用runloop)? –
是的......儘管如果你在一個串行隊列中,那麼提交到該隊列的任何塊將不會運行,直到塊結束。爲什麼你需要根本阻止線程?你需要從調用方法返回一個值嗎? –
我需要等待一個過程才能完成,然後才能繼續。不,我不需要返回一個值。 –