在iphone上排队和处理多个请求

时间:2010-09-01 09:20:46

标签: iphone

在我的应用程序中,我使用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];
 }
}

我想知道将所请求的操作排入队列并将其执行的最佳做法是什么?

提前完成。

1 个答案:

答案 0 :(得分:0)

如您提到的使用多个队列时,很难回答这些问题。我看到了一些需要考虑的事情:

1)您拥有[operation release],然后在KVO处理程序中将operationobject进行比较。在你完成它之前,你不应该释放`操作。在这种情况下,在KVO处理程序中。

2)如上所述,您应该使用isEqualToString

进行字符串比较

3)听起来您正在尝试按顺序运行队列,以便一次只执行一个操作,并在第一个操作完成后排队另一个操作。相反,您可以将队列设置为一次只执行一个操作:

operationQueue.maxConcurrentOperationCount = 1;

然后立即添加所有操作。如果执行顺序很重要,您可以直接使用Grand Central Dispatch并使用dispatch_sync执行队列中特定序列的块。