使用依赖项创建一个 FIFO NSOperationQueue

Using dependencies to create a FIFO NSOperationQueue

我创建了一个 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];
}

这是在某处建议的(我手头没有 link)。麻烦的是我偶尔会在这里崩溃:

* 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'* -[__NSArrayM insertObject:atIndex:]: 对象不能零'

在崩溃时,[[self operations] count] == 0,所以大概在检查 [[self operations] count] > 0 和 addDependency 调用之间的纳秒内,队列上的最后一个操作完成执行,变为nil.

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

如果您无法修复崩溃,您至少可以将 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];
    }
}

这样至少可以避免崩溃。

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

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