从NSOperationQueue取消NSOperation

时间:2012-04-25 10:20:45

标签: iphone ios nsmanagedobject nsoperation nsoperationqueue

我已经从网址下载了信息,我将这个网址作为NSOperation在NSOperationQueue中发送,我想知道,我如何删除特定的NSOperation以下载特定网址的数据,现在我这样做了:

AppDelegate *appController = (AppDelegate *) [[UIApplication sharedApplication] delegate];

    for (NSOperation *op in appController.seriesQueue.operations) {

        if ([op isKindOfClass:[MyDowndload class]]) {

            MyDownload *urlInDownload = (MyDowndload *)op;

            if ([urlInDownload.myNew.urlName isEqualToString:[managedObject valueForKey:@"urlName"]] && [urlInDownload.myNew.language isEqualToString:[managedObject valueForKey:@"language"]]) {
                [op cancel];
            }
        }
    }

我在tableview中有信息,所以当我删除索引路径的行时,我输入此检查,并输入[op cancel]行,但我可以在控制台日志中看到该线程仍然是下载,如何停止并删除它?

2 个答案:

答案 0 :(得分:8)

根据苹果指南,取消手术不会立即迫使它停止它正在做的事情。虽然所有操作都需要遵守isCancelled返回的值,但是您的代码必须显式检查此方法返回的值并根据需要中止。

作为Justin建议的例子......这是根据需要中止执行方法的方式。

- (void)main
 { \\ ...do work... 
   if (self.isCancelled)
      { \\ ...get out...  } 
 } 

NSOperation Class Reference by apple

答案 1 :(得分:0)

要停止下载请求操作,您需要终止/停止该请求的runloop。

要在操作队列中找到特定的操作,我认为上面的操作是允许的简单操作。

如果您需要更多控制权,

创建nsoperation的子类并为每个操作使用tag,以便通过使用唯一标记进行检查来快速找到特定操作。

并在操作的子类中放置一个自定义KVO,以便在需要时立即安静操作。 我的意思是覆盖该线程的start方法。

感谢,

Naveen Shan