目前我已经实现了一个包装NSOperationQueue的类,并保存了一个指向前一个操作的指针。每次我向队列添加另一个操作时,我将前一个操作添加为依赖项,因为操作正在写入同一个文件(并且调用应按顺序执行,我只需要从主线程执行这些操作)。当前的实现看起来像这样......
@interface FileStoreOperationQueue : NSOperationQueue
-(void)createPayloadOperation(NSString* payload);
@property(nonatomic, weak) FileStoreOperation* previousOperation;
@end
@implementation FileStoreOperationQueue
-(void)createPayloadOperation(NSString* payload){
// Create a new FileStoreOperation
// Add the 'previousOperation' as a dependency
// Add new operation to self
// previous operation = newOperation
}
@end
这感觉有点笨拙,有没有一种更自然,更干净的方式来使用API?
答案 0 :(得分:1)
您可以将队列的并发操作数设置为1,从而有效地使队列成为串行队列。文档警告您不应该依赖正在执行的操作,因为操作就绪的更改可以改变执行顺序,但如果您的所有操作都准备好执行,那么您应该没问题。
请参阅-setMaxConcurrentOperationCount:
以及其他操作队列行为部分。
另一个选择是下拉一个级别并使用Grand Central Dispatch的串行队列而不是NSOperationQueue
。这将要求您将操作转换为块,但是您可以按顺序将块执行一个并按顺序执行。
最后,您可以创建自己的NSOperationQueue
子类,自动使每个新操作依赖于前一个操作。它与您现在使用的解决方案相同,除了队列可以跟踪以前的操作并添加依赖关系,因此它应该感觉更干净而不是那么“hacky”。
答案 1 :(得分:0)
依赖关系是在特定操作中执行操作的便捷方式 订购。您可以使用。添加和删除操作的依赖项 addDependency:和removeDependency:方法。默认情况下,一个操作 具有依赖关系的对象在其全部之前不被认为是准备好的 依赖操作对象已完成执行。一旦到最后 然而,依赖操作结束,操作对象变为 准备好并且能够执行。
[operation addDependency: previousOperation];