使用依赖项创建一个 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];
我创建了一个 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];