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

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

我把我的function分成了4个部分,现在想让他们执行一下

[self ReadAllImagesFromPhotosLibrary]; [self WriteFewImagestoDirectory]; [self GettingBackAllImagesFromFolder]; [self MoveToNextView]; 

为了跟进和提高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]; }); 

尽pipe上述调用是asynchronous的 ,但是它们将按照DISPATCH_QUEUE_SERIAL状态进行排队并连续运行同步asynchronous的区别在于同步 ,在运行下面的代码之前, 代码将暂停并等待块答案,因此如果执行时间很长,可能会冻结您的UI。 而asynchronous代码运行和块asynchronous返回

但是,由于GCD(Grand Central Dispatch),您存储在DISPATCH_QUEUE_SERIAL中的任务将按照所添加的顺序一个接一个地执行。

 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操作在主线程中执行。 希望能帮助到你。

你可以使用NSOperationQueue设置为1的maxConcurrentOperationCount (或者甚至为每个NSOperation设置依赖关系,所以它在依赖关系完成之前不会启动)。

这里是NSOperationQueue类参考。

也看看这个问题。

如果有的话,我并不清楚现有的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 } 

为什么不尝试GCD,它保证了操作的顺序,同时具有同步和asynchronousfunction

我在Swift3.0的一个类似的search中有这样的模式取得了一些成功…

 let serialQueue = DispatchQueue.init(label: "com.foo.bar") serialQueue.sync {self.readAllImagesFromPhotosLibrary()} serialQueue.sync {self.rriteFewImagestoDirectory()} serialQueue.sync {self.gettingBackAllImagesFromFolder()} serialQueue.sync {self.moveToNextView()}