2012-07-19 66 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