为NSOperationQueue设置并发操作只会导致该操作次数

时间:2013-05-21 13:44:03

标签: iphone ios multithreading nsoperation nsoperationqueue

MyI有一个带有NSOperation对象的NSOperationQueue

NSOperationQueue *aQueue = [[ NSOperationQueue alloc ] init];
[aQueue setMaxConcurrentOperationCount:3];

for (int index=0; index<=5; index++) {
    MYOperation *anOperation = [[MYOperation alloc] init];//MYOperation subclass from NSOperation
    [aQueue addOperation:anOperation];
}
NSLog(@"Number of Operations:%d",[aQueue operationCount]);//It gives 5 count

队列只允许一次执行3个操作(根据定义)。 当我尝试添加第4个操作时,它会添加到Queue,但操作永远不会被执行并被丢弃。

问题:为什么队列丢弃的操作超过其并发值?

1 个答案:

答案 0 :(得分:4)

NSOperationQueue管理线程以在后台执行提交的操作。 (自10.6起使用Grand Central Dispatch)。默认情况下,提交的操作在辅助线程上执行 在提交一批操作后,您立即查询操作队列 - 此时队列可能尚未开始执行操作,因此正确报告总操作次数为6。 如果在查询队列之前添加一些延迟,它可能已经完成所有操作并报告计数为0.

示例代码:

NSOperationQueue *aQueue = [[ NSOperationQueue alloc ] init];
[aQueue setMaxConcurrentOperationCount:3];

for (int index=0; index<=5; index++) {
    MYOperation *anOperation = [[MYOperation alloc] init];//MYOperation subclass from NSOperation
    [aQueue addOperation:anOperation];
}

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    NSLog(@"Number of Operations:%d",[aQueue operationCount]);//It gives 5 count
});