NSOperationQueue完成后不会启动新方法

时间:2013-05-13 21:29:39

标签: objective-c methods selector nsoperation nsoperationqueue

当我的观察者告诉我没有更多操作时,不会调用函数(performSelector ...)。有趣的是,NSLog(@“队列已完成”)被正确记录。

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                     change:(NSDictionary *)change context:(void *)context
{
if (object == self.operationQueue && [keyPath isEqualToString:@"operations"]) {
    if ([self.operationQueue.operations count] == 0)
    {
        [self performSelector:@selector(refreshCollectionView) withObject:nil afterDelay:0.2];
        // Do something here when your queue has completed
        NSLog(@"queue has completed");

    }
}
else {
    [super observeValueForKeyPath:keyPath ofObject:object
                           change:change context:context];
}
}

编辑

知道了:

dispatch_async(dispatch_get_main_queue(), ^{
             [self performSelector:@selector(refreshCollectionView) withObject:nil afterDelay:0.2];
             });

Dunno为什么要执行SelectorOnMainThread ...没有工作,但它的工作原理。

1 个答案:

答案 0 :(得分:1)

如果您的观察者在与队列相同的线程上被触发,则很可能在完成时收集队列的线程。由于-performSelector:... afterDelay:需要一个正在运行的运行循环,它可能会被丢弃在地板上。

由于您仍在更新UI,请在主线程上执行该选择器。