我最近弹出一个奇怪的错误。 NSOperationQueue说它有1个对象但是我无法访问其中的NSOperation对象。
if ([[queue operations] count] > 0)
op = [queue.operations objectAtIndex:0];
但由于某种原因,它最终会出现以下异常:索引0超出空数组'
的界限我理解错误信息但是我很惊讶,因为我在询问对象本身之前检查了队列数。
有什么想法吗?
答案 0 :(得分:5)
请记住,操作可以在不同的线程上运行,通常是。 NSOperationQueue
实际上有自己的方法来获取名为operationCount
的计数,并提供这个警告:
此方法返回的值 反映了瞬时的数量 队列中的对象并更改为 操作完成。结果是, 当你使用返回时 值,实际操作次数 可能会有所不同。你应该这样做 仅将此值用于近似值 指导,不应该依赖它 对象枚举或其他精确的 计算
您遇到的可能是并发问题。要考虑的一件事是复制操作数组。
NSArray *ops = [queue.operations copy];
if ([ops count] > 0)
{
op = [ops objectAtIndex:0];
//You can check if it has finished using [op isFinished];
//and do what you need to do here
}
[ops release];
<强>更新强>
以下是您可能经常看到这种情况的原因
//Set up and start an NSOperation
...
//Here your call to operations probably put some sort of lock
//around operations to retrieve them but your operation also
//finished and is waiting for your lock to complete to remove
//the operation. The operations call probably returns a copy.
if([[que operations] count] > 0)
{
//Now the operation queue can access its operations and remove
//the item with the lock released (it can actually access as early
//as before the call and count)
//Uh oh now there are 0 operations
op = [queue.operations objectAtIndex:0];
}
答案 1 :(得分:1)
两次通话之间的操作可能已经完成