我有一个视图,它通过NSOperationQueue中的NSOperation加载数据。我希望允许用户在操作完成之前离开此视图。我的问题是,我似乎无法一直这样做,而不会崩溃。这里是我的代码开始操作:如果我尝试删除观察员,以便删除NSOperation的观察者
[SportsViewController retain]: message sent to deallocated instance 0x38b5a0
:如果我离开,而操作仍在进行视图
NSOperationQueue* tmpQueue = [[NSOperationQueue alloc] init];
self.queue = tmpQueue;
[tmpQueue release];
SportsLoadOperation* loadOperation = [[SportsLoadOperation alloc] init];
[loadOperation addObserver:self forKeyPath:@"isFinished" options:0 context:NULL];
[self.queue addOperation:loadOperation];
[loadOperation release];
,我经常会收到这样的错误这种情况不会发生,就像这样:
-(void)viewWillDisappear:(BOOL)animated {
if (self.isLoadingData) {
for (NSOperation *operation in [self.queue operations]) {
if([operation isExecuting]) {
[operation cancel];
[operation removeObserver:self forKeyPath:@"isFinished"];
}
}
}
[super viewWillDisappear:animated];
}
然后我有时会收到此错误:
Terminating app due to uncaught exception 'NSRangeException', reason:
'Cannot remove an observer <SportsViewController 0x661c730> for the key path "isFinished" from <SportsLoadOperation 0x66201a0> because it is not registered as an observer.'
我该如何避免这些问题?
订单没有区别。我认为我误解了freespaces的原始答案 - 我会尝试添加和删除实际构造/销毁方法中的观察者。这听起来更聪明。是否可以在dealloc中引用self,如下所示:'[self removeobserver:self.observer forKeyPath:@“isFinished”]; [观察员发布],观察员=零;'? – 2011-03-19 11:08:58
这是我的解决方案:添加和删除观察者最好在观察到的实例的构建/销毁方法中完成 – 2011-03-27 06:56:07
尽管如此,该如何工作?该操作将尝试通知解除分配操作之前的释放观察者。 – Oscar 2012-01-16 02:47:15