我创建了一个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调用,队列上的最后一个操作完成执行,并成为零。
我的问题是,我该如何解决这个问题?
答案 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];
}
}
这至少可以避免崩溃。