Objective C - 在队列中串行执行异步操作

时间:2014-02-24 17:25:23

标签: objective-c multithreading asynchronous

目前我已经实现了一个包装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​​?

2 个答案:

答案 0 :(得分:1)

您可以将队列的并发操作数设置为1,从而有效地使队列成为串行队列。文档警告您不应该依赖正在执行的操作,因为操作就绪的更改可以改变执行顺序,但如果您的所有操作都准备好执行,那么您应该没问题。

请参阅-setMaxConcurrentOperationCount:以及其他操作队列行为部分。

另一个选择是下拉一个级别并使用Grand Central Dispatch的串行队列而不是NSOperationQueue。这将要求您将操作转换为块,但是您可以按顺序将块执行一个并按顺序执行。

最后,您可以创建自己的NSOperationQueue子类,自动使每个新操作依赖于前一个操作。它与您现在使用的解决方案相同,除了队列可以跟踪以前的操作并添加依赖关系,因此它应该感觉更干净而不是那么“hacky”。​​

答案 1 :(得分:0)

来自NSOperation documents

  

依赖关系是在特定操作中执行操作的便捷方式   订购。您可以使用。添加和删除操作的依赖项   addDependency:和removeDependency:方法。默认情况下,一个操作   具有依赖关系的对象在其全部之前不被认为是准备好的   依赖操作对象已完成执行。一旦到最后   然而,依赖操作结束,操作对象变为   准备好并且能够执行。

[operation addDependency: previousOperation];