我有一个NSInvocationOperation,它可以在后台下载并解析一系列NSXMLDocuments,以响应我的UI。
我停止调用操作的尝试是调用NSOperationQueue的cancellAllOperations。但这似乎不会停止调用的执行。
关于如何解决这个问题,有什么想法吗?
发布于 2009-04-18 06:22:08
这取决于您的NSOperation对象的实现,当它收到已被取消的通知时,实际停止、清理并退出。要取消队列上的所有操作的消息将导致队列停止将新操作出队以运行,并将取消消息发送到当前正在运行的任何操作。
在您的操作的main方法中,当您实际被取消时,您应该检查isCancelled并处理该状态。
有关详细信息,请参阅《线程编程指南》中的Creating and Managing Operation Objects。
发布于 2009-08-11 21:03:42
更新:当我这样做时,仪器会显示大量的泄漏。谨慎行事!我把这个放在这里,以防我真的找到了一些东西,其他人可以想出如何克服泄漏的障碍。
这是一个扭曲的想法,我在输入以下内容时再次尝试:
将操作设置为选择器initWithTarget:NSInvocationOperation's : object : method的对象。假设您已经有一个队列(我们称之为NSOperationQueue ):
NSInvocationOperation *operation = [NSInvocationOperation alloc];
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation];
[queue addOperation:operation];
[operation release];请注意,我们必须将alloc分解为它自己的调用。否则我们不能将对象设置为操作!
然后,在您的操作方法中,将对象强制转换回来,并根据需要对isCancelled进行检查。例如:
- (void)myOperation:(id)object {
NSInvocationOperation *operation = (NSInvocationOperation *)object;
if ([operation isCancelled]) return;
...
}确保您的选择器在initWithTarget中以冒号结尾:...调用,因为您现在将传入一个对象。
到现在为止还好。现在,如果我可以强制cancelAllOperations,我将知道这是否真的有效。:)
发布于 2010-06-02 19:16:11
您需要检查NSInvocationOperation isCancelled是否为YES。要在NSInvocationOperation中做到这一点,您可以使用键值观察:
在运行操作时将您的对象添加为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;来观察NSOperationQueue的cancellAllOperations是否更改了isCancelled。您可以在此处设置私有标志,如果需要,targetMethod可以对其进行检查并取消。
https://stackoverflow.com/questions/763003
复制相似问题