如何在IOS中取消/退出/停止Thread对象或后台运行的线程的执行

iDe*_*mit 6 iphone objective-c ios5 ios6

我正在分离一个线程在后台执行一些操作,请参考下面的代码

 currentThread = [[NSThread   alloc]initWithTarget:contactServiceselector:@selector(requestForContactBackup:)object:msisdn];

 [currentThread start];
Run Code Online (Sandbox Code Playgroud)

这个currentThread就是AppDelegate中声明的指针。我的视图上有一个按钮,点击它,后台线程的执行应该停止。参考下面的代码:

-(void)cancelTheRunningTasks {
    
   if(self.currentThread !=nil) {

        [currentThread cancel];
        NSLog(@"IsCancelled: %d",[currentThread isCancelled]);   //here Yes returns
        [self removeNetworkIndicatorInView:backUpViewController.view];
    }  
}
Run Code Online (Sandbox Code Playgroud)

下面代码的问题是后台线程仍然处于执行状态。

我的问题是,有了线程引用,如何从主线程取消/停止执行/杀死后台线程?

请建议我可能的解决方案。谢谢。

iDe*_*mit 3

我解决了问题。正是我想要做的,我想停止或终止主线程或其他线程中某些后台线程的工作状态。当我阅读Apple文档和一些帖子时,我得出的结论是,我们不能从其他线程中杀死一个线程,因为所有线程共享公共内存空间和资源,并且通过其他线程杀死该线程并不是更好(但一个进程可以杀死另一个进程,因为两个进程之间没有公共内存空间共享)。然后我得到信息,我们无法像这样退出/杀死线程,但我们仍然可以从其他线程设置正在运行的线程的取消属性。(在用户请求取消任务的代码中)。

所以这里我们可以设置cancel属性。在我们正在执行的后台任务代码中,只需检查取消属性是否已设置。(我们需要在执行一段代码后进行监视)。如果设置了取消属性/是,则在该后台线程代码中调用 [Thread exit] 并释放该线程分配的所有内存以防止内存泄漏(自动释放池不会在此处负责释放资源)。

这就是我解决问题的方法。

简单来说-->只需将您想要取消的特定任务的属性设置为取消集。(设置取消的方法将由线程对象引用调用)。

 if(self.currentThread != nil && [currentThread isExecuting])
   {
      [currentThread cancel];
   }
Run Code Online (Sandbox Code Playgroud)

然后在代码中监视取消属性。如果属性设置则退出线程。

if([appDelegate.currentThread isCancelled])
 {
      [NSThread exit];
 }
Run Code Online (Sandbox Code Playgroud)

如果有人有比这更好的解决方案,请参考。否则它也能正常工作。