代码之家  ›  专栏  ›  技术社区  ›  neha

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

  •  3
  • neha  · 技术社区  · 14 年前

    在我的应用程序中,我使用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 回复  |  直到 13 年前
        1
  •  0
  •   XJones    13 年前

    这将很难回答w/o,因为您提到使用多个队列时会看到更多的代码。我看到一些需要考虑的事情:

    1)你有 [operation release] 然后你比较 operation object 在您的kvo处理程序中。在完成操作之前,不应释放操作。在这种情况下,在kvo处理程序中。

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

    3)听起来您试图按顺序运行队列,这样一次只执行一个操作,而在第一个操作完成后将另一个操作排队。相反,您可以将队列设置为一次只执行一个操作,方法是:

    operationQueue.maxConcurrentOperationCount = 1;
    

    然后一次添加所有操作。如果执行命令很重要,您可以直接使用Grand Central Dispatch并使用 dispatch_sync 在队列上按特定顺序执行块。