我有一个循环,我运行并在每次迭代我有一个我希望在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];
}
答案 0 :(得分:3)
您描述的这种奇怪的行为(即使在队列被暂停后,以前排队的操作将继续启动)也是由您创建串行队列的方式引起的。
通常,您可以通过设置maxConcurrentOperationCount
:
m_OpQueue.maxConcurrentOperationCount = 1;
如果你这样做(不需要设置underlyingQueue
),你会看到预期的行为。