为什么我的NSOperationQueue在暂停时不会停止执行?

时间:2015-11-05 06:40:26

标签: ios objective-c iphone nsoperationqueue

我有一个循环,我运行并在每次迭代我有一个我希望在NSOperationQueue上运行的块。底层队列是串行的。此循环可能会添加数百个可能长时间运行的块任务。当我设置m_opQueue.suspended = YES时,块仍将继续执行。

我很清楚单个块无法在中间停止,但我预计暂停NSOperationQueue只会暂停执行下一个操作,直到被挂起为止。

任何人都可以解释我是错了还是我如何实现我的目标?

dispatch_queue_t index_queue = dispatch_queue_create("someQueue", DISPATCH_QUEUE_SERIAL);
m_OpQueue = [[NSOperationQueue alloc] init];
m_OpQueue.underlyingQueue = index_queue;


for ( NSUInteger i = 0; i < total; i++ ) {

    void (^block)(void) = ^void() {            
        // Do stuff.
        NSLog(@"processing complete.");

    };

    // Effectively adds a NSBlockOperation.
    [m_OpQueue addOperationWithBlock:block];

}

1 个答案:

答案 0 :(得分:3)

您描述的这种奇怪的行为(即使在队列被暂停后,以前排队的操作将继续启动)也是由您创建串行队列的方式引起的。

通常,您可以通过设置maxConcurrentOperationCount

来创建串行操作队列
m_OpQueue.maxConcurrentOperationCount = 1;

如果你这样做(不需要设置underlyingQueue),你会看到预期的行为。