Bar*_*vel 15 objective-c fifo nsoperationqueue ios serial-processing
是否可以通过将NSoperationQueue对象设置maxConcurrentOperationCount为1 来将对象用作串行FIFO队列?
我注意到文档声明......
对于最大并发操作数设置为1的队列,这相当于一个串行队列.但是,您永远不应该依赖于操作对象的串行执行.
这是否意味着无法保证FIFO执行?
BJ *_*mer 24
在大多数情况下,它将是FIFO.但是,您可以在NSOperations之间设置依赖关系,以便提前提交的操作将允许其他操作在队列中传递它,直到其依赖关系得到满足.
这种依赖关系管理是文档表明无法保证FIFO的原因.但是,如果您没有使用依赖项,那么依靠它应该没问题.
更新:NSOperation还有一个queuePriority属性,它也可以使操作以非FIFO顺序执行.始终执行没有挂起依赖项的最高优先级操作.
NSOperation子类也可能会覆盖-isReady,这可能导致它在队列中移回.
因此,队列上的执行保证是串行的,因为在此队列中一次只能运行一个操作.但Apple无法保证FIFO; 这取决于你对所投入的操作所做的事情.
Dan*_*iel 13
队列不是文档中提到的FIFO.如果确保任何新操作取决于队列中添加的最后一个操作,并且它一次只能运行一个操作,则可以将其严格设置为FIFO.Omar解决方案是正确的,但更一般地说,您可以执行以下操作:
NSOperationQueue* queue = [[ NSOperationQueue alloc ] init];
queue.maxConcurrentOperationCount = 1;
NSOperation* someOperation = [ NSBlockOperation blockOperationWithBlock:^(void) { NSLog(@"Done.");} ];
if ( queue.operations.count != 0 )
[ someOperation addDependency: queue.operations.lastObject ];
Run Code Online (Sandbox Code Playgroud)
这是因为queue.operations是一个数组:你添加的任何内容都没有重新排序(例如它不是NSSet).您也可以简单地在NSOperationQueue中添加一个类别:
@interface NSOperationQueue (FIFOQueue)
- (void) addOperationAfterLast:(NSOperation *)op;
@end
@implementation NSOperationQueue (FIFOQueue)
- (void) addOperationAfterLast:(NSOperation *)op
{
if ( self.maxConcurrentOperationCount != 1)
self.maxConcurrentOperationCount = 1;
NSOperation* lastOp = self.operations.lastObject;
if ( lastOp != nil )
[ op addDependency: lastOp ];
[ self addOperation:op];
}
@end
Run Code Online (Sandbox Code Playgroud)
并使用[queue addOperationAfterLast:myOperation].queuePriority与FIFO无关,它与作业调度有关.
编辑:在下面的评论之后,如果检查计数,则暂停队列也是不够的.我相信这种形式很好(经过测试,这不会造成竞争条件,也不会崩溃).
一些信息:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/#//apple_ref/occ/instp/NSOperationQueue/suspended
| 归档时间: |
|
| 查看次数: |
11944 次 |
| 最近记录: |