2011-03-16 56 views
1

是否有可能取消一個線程while performSelector waitsUntilDone?performSelector NSThread問題

見下文:

我有以下行while循環:

[self performSelector:@selector(getMyRecords:) onThread:myThread withObject:i waitUntilDone:YES] 

有時候,我要取消我的線程myThread,而我的循環執行。我獲得以下崩潰問題:

Terminating app due to uncaught exception 'NSDestinationInvalidException', reason: '*** -[MyController performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform' 

回答

-1

退房NSObject的的文檔:

此方法隊列使用 與 NSRunLoopCommonModes相關聯的默認的運行循環模式,也就是說, 模式目標線程的 運行循環的消息不變。作爲其正常運行循環處理的部分 ,目標線程使隊列消息 (假設它運行在 默認運行循環模式之一中)並調用 所需的方法。

使用此方法不能取消排隊的郵件 。如果你想取消 當前線程上的消息的 選項,則必須使用 的 performSelector:withObject:afterDelay: 或 performSelector:withObject:afterDelay:inModes: 方法。

此方法保留接收方和 arg參數,直到執行 選擇器。

+0

這個答案與問題無關 – 2018-02-23 18:22:20

+0

它回答了這個問題。說你不能取消 – RaffAl 2018-02-23 18:52:05

+0

問題是關於取消*線程*,而不是發佈的消息。您建議使用另一種排隊消息的方法,以便修復停止線程的崩潰。這是一個非常誤導性的答案。 – 2018-02-25 21:03:29

0

,如果你有一個線程中一個長期運行的操作,你可以聲明條件變量(原子),如「取消」,並檢查它。 類似:

- (void) threadFunc { 
while (!canceled){ 
    // do stuff 
} 
} 


- (void) cancelThread { 
canceled = true; 
}