2011-03-07 52 views
6

从文档:iOS - 如何检查NSOperation是否在NSOperationQueue中?

的操作对象可以是在一个时间至多一个操作队列,并且如果该操作已在另一个队列此方法将引发NSInvalidArgumentException异常。同样,如果操作当前正在执行或已经完成执行,此方法将引发NSInvalidArgumentException异常。

那么如何检查我是否可以安全地将NSOperation添加到队列中?

我知道的唯一方法是添加操作,然后尝试捕获异常,如果操作已经在队列中或之前执行。

回答

14

NSOperationQueue对象有一个名为operations的属性。

如果你有一个引用你的队列,很容易检查。

可以检查作业的NSArray的包含您NSOperation这样的:

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

NSOperation *operation = [[NSOperation alloc] init]; 

[queue addOperation:operation]; 

if([queue operations] containsObject:operation]) 
    NSLog(@"Operation is in the queue"); 
else 
    NSLog(@"Operation is not in the queue"); 

或者你可以在所有的对象迭代:

for(NSOperation *op in [queue operations]) 
    if (op==operation) { 
     NSLog(@"Operation is in the queue"); 
    } 
    else { 
     NSLog(@"Operation is not in the queue"); 
    } 

告诉我,如果这是你在找什么对于。

或者,NSOperation对象有几个属性可以让你检查它们的状态;如:isExecutingisFinishedisCancelled,等...

+0

但如果我有多个操作队列会发生什么?我应该检查每个操作队列吗?我可以做到这一点,但这是最好的办法吗? – 2011-03-07 08:54:22

+1

@ xlc0212:我能想到的另一个解决方案是子类NSOperation,它实际上受到了Apple的鼓励;并添加一个布尔属性“isInQueue”,并将其添加到队列中时标记为YES。像这样,您只需在将操作添加到队列之前检查此属性。 – Zebs 2011-03-07 09:08:21

+0

我应该何时标记操作?我应该在将它添加到队列中之前手动设置它,还是应该重写将由队列调用的一些方法,然后设置标志 – 2011-03-07 09:31:35

4

当您添加一个的NSOperation对象到NSOperationQueue,在NSOperationQueue保留的对象,所以的NSOperation的创建者可以释放。如果你保持这种策略,NSOperationQueues将始终是它们的唯一所有者NSOperation对象,因此您将无法将对象添加到其他任何队列中的NSOperation对象。

如果你还是想引用单个的NSOperation对象后,他们已经加入到队列中,你可以这样做使用NSOperationQueue- (NSArray *)operations方法。

相关问题