使用依赖关系创建FIFO NSOperationQueue

时间:2015-10-21 15:23:01

标签: ios nsoperation nsoperationqueue fifo

我创建了一个NSOperationQueue子类,将maxConcurrentOperations设置为1,并将addOperation方法重写为以下内容:

-(void)addOperation:(NSOperation *)op
{
    // If there are already operations on the queue, add the last operation as a dependency to the delay. Ensures FIFO.
    if ([[self operations] count] > 0) [op addDependency:[self.operations lastObject]];
    [super addOperation:op];
}

这是在某处提出的(我手边没有链接)。麻烦的是我偶尔会遇到崩溃:

*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'* - [__ NSArrayM insertObject:atIndex:]:object不能为nil'

在崩溃时,[[自我操作]计数] == 0,因此可能在检查[[自我操作]计数]>之间的纳秒内。 0,和addDependency调用,队列上的最后一个操作完成执行,并成为零。

我的问题是,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

要避免此NSInvalidArgumentException问题,请在此方法的持续时间内建立对lastObject的本地引用,然后测试:

NSOperation *lastOperation = [self.operations lastObject];
if (lastOperation) [op addDependency:lastOperation];

答案 1 :(得分:1)

如果无法修复崩溃,至少可以将addDependency包装在try-catch块中:

-(void)addOperation:(NSOperation *)op {
    @try {
        if ([[self operations] count] > 0) [op addDependency:[self.operations lastObject]];
    }
    @catch (NSException *exception) {
        // ignore    
    }
    @finally {
        [super addOperation:op];
    }
}

这至少可以避免崩溃。