2011-03-26 94 views
1

有什么办法,我可以通过杀死一个线程产卵:杀死一个线程或替代

[NSThread detachNewThreadSelector:@selector(serverFetchInThread) toTarget:self withObject:nil]; 

我工作的情况是,在我的主线程我又让用户在我的搜索栏输入数据和什么用户输入我需要发送到服务器在单独的线程中搜索。现在,如果用户通过删除旧数据并输入新数据来更改他的选择,我不希望以前的线程浪费时间,杀死它并用新数据产生一个新线程。

有没有其他更好的方法来处理这种情况,请指导我。

回答

3

不,没有办法杀死另一个线程的线程。有充分的理由,因为没有办法这样做,即杀死目标线程而没有崩溃应用程序的风险。

直接回答你的问题;你需要有一种标志,告诉线程它应该停止正在做的事情并退出。

首先,你为什么要使用线程和不使用GCD:

然而,一对夫妇的问题,是由你的问题提出?通过GCD或NSOperation进行并发是解决此类问题的一般建议方法。其次,如果您正在与服务器交谈,您是否使用HTTP(大多数情况下,情况就是如此)?如果是这样,为什么不直接使用NSURL和朋友的异步功能呢?

+0

谢谢。我正在使用异步HTTP连接。你能否给我们提供一些更多关于使用标志和指示线程停止运行的信息。我将在主线程中设置标志,对吧?我如何在单独的线程中读取它。 – Abhinav 2011-03-26 19:31:52

+0

只需调用它的'cancel'方法就可以停止NSHTTPConnection。 – peterjb 2011-03-26 19:42:30

+0

这是正确的,但一旦一个asyc服务器调用在一个线程中,我怎么能从主线程调用它的取消方法。 – Abhinav 2011-03-26 20:39:21

1

请仔细阅读使用NSOperationQueue

您可以继承NSOperation以包装您的服务器通信,甚至可以创建队列序列(最大操作数= 1)。

如果服务器操作尚未完成并且用户已生成更多输入,则可以取消现有的操作并添加新操作。

由于包装连接的NSOperation的影响,您可以使用简单的同步版本,并保持连接处理非常简单。

另外值得一提的是兼容性。我宁愿使用GCD和块,但为了兼容性,需要NSOperationQueue