简单的GCD串行队列示例,例如使用块的FIFO

时间:2013-07-02 09:01:40

标签: ios objective-c-blocks grand-central-dispatch

我阅读了Apple文档,了解如何使用串行队列来确保以可预测的顺序执行任务但现在我感到困惑。
一些我如何能够连续工作,但我仍然不清楚,所以我需要简单的串行示例,我的方法连续执行。

我将我的功能划分为4个部分,现在希望它们执行Serially

[self ReadAllImagesFromPhotosLibrary];

[self WriteFewImagestoDirectory];

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView];

6 个答案:

答案 0 :(得分:42)

要跟进并改进 iCoder 的答案,您可以而且应该执行以下操作。

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(serialQueue, ^{
        [self ReadAllImagesFromPhotosLibrary];
    }); 
dispatch_async(serialQueue, ^{
         [self WriteFewImagestoDirectory];
});
dispatch_async(serialQueue, ^{
    [self GettingBackAllImagesFromFolder]; 
});
dispatch_async(serialQueue, ^{
    [self MoveToNextView];
});

尽管上述调用是 async ,但它们将排队并以 DISPATCH_QUEUE_SERIAL 状态串行运行同步 async 之间的区别在于同步,您的代码将暂停并等待以获得阻止答案运行以下代码,因此如果执行时间很长,可能会冻结您的UI。使用异步时,代码会运行,并且异步 返回块。

但是,您存储在 DISPATCH_QUEUE_SERIAL 中的任务将按照添加顺序依次等待并执行,这要归功于GCD(Grand Central Dispatch)。

答案 1 :(得分:5)

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(serialQueue, ^{
        [self ReadAllImagesFromPhotosLibrary];
             dispatch_async(serialQueue, ^{
                     [self WriteFewImagestoDirectory];
                     dispatch_async(serialQueue, ^{
                         [self GettingBackAllImagesFromFolder]; 
                         dispatch_async(serialQueue, ^{
                              [self MoveToNextView];
                         });
                   });
              });
    }); 

我认为上面的代码应该可行,但要确保UI操作在主线程中执行。希望它有所帮助。

答案 2 :(得分:1)

您可以将NSOperationQueuemaxConcurrentOperationCount设置为1(甚至为每个NSOperation设置依赖关系,以便在依赖关系完成之前不会启动)。

以下是NSOperationQueue班级参考。

另请查看this问题。

答案 3 :(得分:1)

我不太了解现有的API,如果有的话,也可以使用块。

但是同样可以通过以一种方式定义块(代表你想要的操作)来实现,它们指向下一个块以继续进行(如果有的话)。此外,您可以将整个处理放在单独的队列中。

使块以串行方式执行的片段

BLOCK A(NEXT BLOCK reference){  
->Do the the required Task  
->If(next Block reference)  
--->Then call that block 
->Else  
--->Exit or have a callback on mainthread   
}  

答案 4 :(得分:0)

为什么不试试GCD,它保证了操作顺序,同时具有同步和异步功能

答案 5 :(得分:-1)

我在Swift 3.0中的类似搜索中使用了这样的模式取得了一些成功......

let serialQueue = DispatchQueue.init(label: "com.foo.bar")

serialQueue.sync {self.readAllImagesFromPhotosLibrary()}

serialQueue.sync {self.rriteFewImagestoDirectory()}

serialQueue.sync {self.gettingBackAllImagesFromFolder()}

serialQueue.sync {self.moveToNextView()}