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

Iphone 如何在IOS中取消/退出/停止执行后台运行的线程对象或线程,iphone,objective-c,ios5,ios6,Iphone,Objective C,Ios5,Ios6,我按照下面给出的方法分离线程,以便在后台执行一些操作 currentThread = [[NSThread alloc]initWithTarget:contactServiceselector:@selector(requestForContactBackup:)object:msisdn]; [currentThread start]; 此currentThread是AppDelegate的指针。 我的视图上有一个按钮,当我按下它时,我想取消或停止后台线程的执行 要这样做: -(

我按照下面给出的方法分离线程,以便在后台执行一些操作

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

 [currentThread start];
此currentThread是AppDelegate的指针。 我的视图上有一个按钮,当我按下它时,我想取消或停止后台线程的执行

要这样做:

-(void)cancelTheRunningTasks {

   if(self.currentThread !=nil) {

        [currentThread cancel];
        NSLog(@"IsCancelled: %d",[currentThread isCancelled]);   //here Yes returns
        [self removeNetworkIndicatorInView:backUpViewController.view];
    }  
}
问题是后台线程仍在执行中

使用my thread Reference如何从主线程取消/停止执行/终止后台线程

请参考一些解决方案。
谢谢。

取消
更改接收器的已取消状态以指示其应退出

退出
终止当前线程

检查

有关取消和操作对象的详细信息,请参阅


注意:在OS X v10.6中,取消方法的行为因操作当前是否在操作队列中而不同。对于未排队的操作,此方法会立即将操作标记为已完成,并生成相应的KVO通知。对于排队操作,它只是将操作标记为准备好执行,并让队列调用其开始方法,该方法随后退出并导致从队列中清除操作。

您的后台线程需要检查是否已通过
isCancelled
方法取消操作

if ([[NSThread currentThread] isCancelled]) {
    // do cleanup here
    [NSThread exit];
}

您无法从外部终止线程,因为无法知道线程可能处于何种状态,因此,终止线程将产生不确定的行为(想象一下,当线程被终止时,如果线程在分配器中持有一个互斥锁……哎哟)。

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

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

这就是我解决问题的方法

在简单-->中,只需将要取消的特定任务的属性设置为“取消集”。(设置取消的方法将由线程对象引用调用)

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

if([appDelegate.currentThread isCancelled])
 {
      [NSThread exit];
 }

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

在[currentThread cancel]之后;在这一行中,尝试再添加一行currentThread=nil@穆纳尔:那没用。我也试过退出。我在上面写过一个函数,如果我在那里使用[NSthread exit],它将停止/退出线程,而不是UI阻塞的预期结果。因为这在主线程上起作用,我们试图停止主线程。我们需要释放代码中分配的所有资源。因为在线程之后,自动释放将不负责释放所有资源。我的后台任务正在其他服务类中工作,现在如何在取消或退出/终止线程期间释放这些资源。@Rajneesh071 exit是类方法。您不能调用[YourThreadExit];
if([appDelegate.currentThread isCancelled])
 {
      [NSThread exit];
 }