2009-04-18 69 views
9

我有一个NSInvocationOperation,可以在后台下载和解析一系列NSXMLDocuments以响应我的UI。如何停止NSInvocationOperation?

我试图停止调用操作是调用我的NSOperationQueue的cancellAllOperations。但似乎这不会阻止调用的执行。

关于如何解决此问题的任何想法?

回答

3

这取决于你的NSOperation对象实现真正停止它在做什么,清理和退出时得到通知,它的被取消。要取消队列上所有操作的消息传递将导致队列停止将新操作出列并运行,并将取消消息发送到当前正在运行的任何操作。

在您操作的主要方法,你应该检查isCancelled和处理这种状态时,你实际上是取消了。

欲了解更多信息,请参阅线程编程指南中的Creating and Managing Operation Objects。上述

+0

但看到其他答案,它听起来像你不能这样做(至少在检查`isCancelled`的标准方式)使用'NSInvocationOperation`时。 – jrdioko 2011-05-31 18:14:35

5

的职位是伟大的,但更直接地回答原来的问题:看来,你不能阻止NSInvocationOperation对象,因为它不支持取消。你将不得不继承它的子类。

11

UPDATE:仪器显示的泄漏-A-很多我这样做的时候。 谨慎行事!我在这里保持这种情况,以防我实际上处于某种状况,而其他人可以弄清楚如何克服漏洞障碍。

这里有一个扭曲的想法,这我再努力,因为我输入:

设置操作为对象NSInvocationOperationinitWithTarget:选择:对象:方法。假设你已经有一个NSOperationQueue(我们就叫它队列):

NSInvocationOperation *operation = [NSInvocationOperation alloc]; 
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation]; 
[queue addOperation:operation]; 
[operation release]; 

请注意,我们必须掰开ALLOC到它自己的呼叫。否则我们不能设置对象操作

然后,在您的操作方法中,将对象抛回并根据需要对进行检查iswasCallarlled。例如:

- (void)myOperation:(id)object { 
    NSInvocationOperation *operation = (NSInvocationOperation *)object; 
    if ([operation isCancelled]) return; 
    ... 
    } 

确保你选择用冒号后面的initWithTarget结束:...通话,因为你在一个对象路过了。

到目前为止,这么好。现在,如果我可以强制cancelAllOperations,我会知道这是否真的有效。 :)

+0

由于泄漏,不会尝试。但想法很棒! – 2012-06-13 17:39:02

8

您需要检查NSInvocationOperation isCancelled是否。 要做到这一点在NSInvocationOperation,您可以使用Key值观察:

运行操作时添加您的对象作为NSInvocationOperation isCancelled观察员:

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:<targetObj> selector:@selector(<targetMethod>) object:nil]; 
[operation addObserver:<targetObj> forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil]; 
[operQueue addOperation:operation]; 
[operation release]; 

然后在targetObj实施

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 

观看因为isCancelled被NSOperationQueue的cancellAllOperations所改变。 您可以在此处设置私人标志,并且targetMethod可以检查它并在需要时取消。