2012-07-19 35 views
1

我在我的應用程序中有一個搜索功能,用戶在textField中鍵入內容,並且隨着文本更改,我正在搜索本地數據庫並在表中填充數據。Objective-C - 取消線程?

搜索可能需要幾秒鐘的任何地方10之間1根據輸入的文本,所以我決定使用一個線程。每當文本改變時,我想取消線程(如果已經運行),並用new關鍵字重新啓動它。問題是根據文檔調用取消不保證線程將被終止。那麼這裏的解決方案是什麼?

有沒有什麼辦法來殺死一個線程?

- (void)populateData 
{ 
    if (self.searchThread.isExecuting) 
    { 
     [self.searchThread cancel]; 
    } 

    [self.searchThread start]; 
} 

- (void)populateDataInBackground 
{ 
    @autoreleasepool 
    { 
     // get data from db 
     // populate table on main thread 
    } 
} 

回答

4

你不想線程不一定死,因爲這將在以後重用(使線程是昂貴的)。你應該做的是把你的工作分成儘可能多的部分,並在每件之間檢查你的線程的isCancelled屬性是YES。如果是這樣,返回沒有更新。

[NSThread currentThread]應該回到你的線程,而你在裏面populateDataInBackground

+0

有一行代碼可以從數據庫中獲取數據,一行代碼可以填充表格,我不知道我怎麼能把它分成幾塊:) – aryaxt 2012-07-19 04:33:35

+0

然後我想你只需要在這兩行之間檢查一下,我猜大部分工作都在第一步,表的更新是微不足道的,我懷疑你可以隨意殺死任何事情,你可以在線程中調用exit,但文檔警告不要,你可能只需要使用cancel作爲是否更新表的標誌。 – borrrden 2012-07-19 04:36:30

1

其中一些可能的解決方案將包括這樣的:

從你的主線程設置一些「BOOL」旗語/屬性(例如「searchNow」),並定期讀取它,而你要通過你的「populateData」後臺線程/任務。

如果狀態更改爲「NO」(假設「searchNow」 == YES意味着任務應該繼續),然後退出你的後臺線程。

+0

如何退出後臺線程?取消不會立即退出線程。 – aryaxt 2012-07-19 04:26:59

+0

如果你的線程在某個循環內運行(例如「do {} while(searchNow == YES);'),那麼該線程將退出並且@ borrrden的建議也很好(給他+1),但我不認爲線程設置起來非常昂貴,尤其是在偶爾輸入文本的時候只需要把線程調出來 – 2012-07-19 05:15:49

2

我結束了我的修改,以數據存儲在同一時間返回10個項目,只是爲了測試。我稍後可能會使用另一個數字。這樣我可以在我的while循環中退出線程。

另一個優點是,這樣我可以填充表,因爲我經歷的項目,而不是等待被檢索的所有數據。

@interface ViewController 

@property (nonatomic, strong) NSthread *searchThread; 

@end 

@implementation ViewController 
@synthesize searchThread = _searchThread; 

- (void)populateData 
{ 
    [self.searchThread cancel]; 

    self.searchThread = [[NSThread alloc] initWithTarget:self selector:@selector(populateDataInBackground) object:nil]; 
    [self.searchThread start]; 
} 

- (void)populateDataInBackground 
{ 
    @autoreleasepool 
    { 
     [self.array removeAllObjects]; 

     // I added paging functionality to my sql, so I get let's say 10 records at a time 
     while (/*has data*/) 
     { 
      NSArray *arrayOf10 = [self.dataStorage getdatafromIndex:startingIndex withCount:10]; 

      if ([[NSThread currentThread] isCancelled]) 
       [NSThread exit]; 

      [self.array addObjects:arrayOf10]; 
      [self.tableView performSelectorOnMainThread:@Selector(reloadData) withObject:nil waitUntilDone:NO]; 
     } 
    } 
} 

@end 
+0

換句話說,「把你的工作分解成儘可能多的部分」??;);) – borrrden 2012-07-19 06:52:04

+0

是的,我發佈了這個答案僅供將來參考:) – aryaxt 2012-07-19 06:57:43