2013-03-21 171 views
0
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     while(!weakSelf.isAnotherThreadCompleted && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) 
      ; 
     [weakSelf doSomething]; 

    }); 

將異步線程以這種方式等待另一個線程是否正確?GCD和線程等待

回答

1

您將停止對應於DISPATCH_QUEUE_PRIORITY_DEFAULT的全局隊列。如果您向該隊列派發其他內容,則在您完成等待之前,它不會執行。

另外,我不認爲在這個調度隊列對應的線程中會存在一個運行循環,所以你打算通過調用- currentRunLoop來創建一個循環,因爲沒有源代碼會被附加到它,它會返回立即與值NO(或,將有一個隨機運行循環,並且行爲將是完全不可預知的)。

爲什麼不在工作線程的末尾調用一個塊?或者只使用一種機制(GCD,NSOperation,線程,運行循環)及其同步,而不是混合它們?

+0

感謝您的詳細解答,我只是想明白這樣做是否正確。但我不明白爲什麼currentRunLoop會立即返回?現在它按照你說的那樣工作,這就是爲什麼我打開這個話題。 – taffarel 2013-03-21 12:14:09

+0

查看文檔' - runMode:beforeDate:',如果沒有連接到運行循環的輸入源或計時器,它將立即返回。就你而言,你可能創建了一個新的運行循環,所以它沒有任何附加。另外,當你使用'dispatch_async'時,你不能控制代碼運行的線程,這是OS和GCD的業務。運行循環是線程特定的,因此您不應該在GCD調用中使用它們(除非您在主隊列中,這是唯一保證位於特定線程上的主線程)。 – Guillaume 2013-03-21 12:23:06