在我的应用程序中,我使用NSOperationQueue和NSInvocationOperation对象来执行所有操作。我的应用程序中有多个队列,我正在使用KVO“isFinished”,我正在主线程上执行下一个操作。
问题是:每当我一个接一个地执行两个操作时,我的应用程序崩溃说:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<myViewController: 0x481b200>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: isFinished
Observed object: <NSInvocationOperation: 0x45d9ea0>
Change: {
kind = 1;
}
Context: 0x0'
我的一般代码如下:
operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(somemethod) object:nil];
[operation addObserver:self forKeyPath:@"isFinished" options:0 context:nil];
[operationQueue addOperation:operation];
[operation release];
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqual:@"isFinished"] && operation == object)
{
[operation removeObserver:self forKeyPath:@"isFinished"];
[self performSelectorOnMainThread:@selector(newerPostLoadingNumberOfUdates) withObject:nil waitUntilDone:YES];
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
我想知道将所请求的操作排入队列并将其执行的最佳做法是什么?
提前完成。
答案 0 :(得分:0)
如您提到的使用多个队列时,很难回答这些问题。我看到了一些需要考虑的事情:
1)您拥有[operation release]
,然后在KVO处理程序中将operation
与object
进行比较。在你完成它之前,你不应该释放`操作。在这种情况下,在KVO处理程序中。
2)如上所述,您应该使用isEqualToString
3)听起来您正在尝试按顺序运行队列,以便一次只执行一个操作,并在第一个操作完成后排队另一个操作。相反,您可以将队列设置为一次只执行一个操作:
operationQueue.maxConcurrentOperationCount = 1;
然后立即添加所有操作。如果执行顺序很重要,您可以直接使用Grand Central Dispatch并使用dispatch_sync
执行队列中特定序列的块。