2010-07-25 40 views
3

如何取消Objective-C中的後臺線程?取消Objective-C中的後臺線程

我打電話後臺線程像這樣:

[self performSelectorInBackground:@selector(setupThumbnails) withObject:nil]; 

當刷卡時,對於每刷卡我想取消先前的後臺線程請求調用它。

回答

2

維護線程的取消屬性,並在線程中定期檢查它。您需要使用鎖或原子函數(由操作系統及其框架提供,而不是自己實現!)來指示線程應該被取消。系統提供的原子功能記錄在atomic聯機幫助頁中。

更好的辦法是在NSOperationQueue上使用NSOperation而不是NSThread。它仍然會使用線程在後臺執行工作,但它可以讓框架和操作系統代表您管理線程池,而NSOperation本身有一個可以檢查的isCancelled屬性 - 以及取消單個NSOperation或者整個NSOperationQueue中的所有操作。

例如,您可以「設置一個縮略圖」操作,然後將一個此類操作添加到每個要設置的縮略圖的隊列中。操作系統和框架將合作管理用於執行這些操作的線程數量,但您也可以設置隊列的寬度以確保只有最多一次運行多個導入。如果用戶取消,則可以要求隊列取消所有未完成的操作。