Ios 简单的GCD串行队列示例,如使用块的FIFO
我阅读了苹果公司关于如何使用串行队列来确保任务以可预测的顺序执行的文档,但现在我太困惑了。Ios 简单的GCD串行队列示例,如使用块的FIFO,ios,objective-c-blocks,grand-central-dispatch,Ios,Objective C Blocks,Grand Central Dispatch,我阅读了苹果公司关于如何使用串行队列来确保任务以可预测的顺序执行的文档,但现在我太困惑了。 一些我如何能够串行工作,但我仍然不清楚,所以我需要我的方法串行执行简单的串行示例 我将我的功能划分为4个部分,现在希望它们以串行方式执行 [self ReadAllImagesFromPhotosLibrary]; [self WriteFewImagestoDirectory]; [self GettingBackAllImagesFromFolder]; [self MoveToNextVie
一些我如何能够串行工作,但我仍然不清楚,所以我需要我的方法串行执行简单的串行示例 我将我的功能划分为4个部分,现在希望它们以串行方式执行
[self ReadAllImagesFromPhotosLibrary];
[self WriteFewImagestoDirectory];
[self GettingBackAllImagesFromFolder];
[self MoveToNextView];
您可以使用
NSOperationQueue
,将maxConcurrentOperationCount
设置为1(甚至可以为每个NSOperation设置依赖项,这样它在依赖项完成之前不会启动)
这是课堂参考资料
再看一个问题
我认为上面的代码应该可以工作,但是要确保UI操作在主线程中执行。希望它能有所帮助。我不太清楚现有的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呢?它保证了操作的顺序,还具有同步和异步功能。要跟进和改进客户的答案,您可以而且应该执行以下操作
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];
});
尽管上述调用是异步的,但它们将排队并在调度队列(u SERIAL)状态下连续运行。sync和async之间的区别在于,使用sync时,您的代码将暂停并等待块应答,然后再运行以下代码,因此,如果执行时间长,可能会冻结您的UI。而使用async,则代码继续运行,块以异步方式返回
但是,由于GCD(中央大调度),您存储在调度队列序列中的任务将等待并按添加顺序依次执行。我在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()}
如果您对以下其中一个答案感到满意,请将其标记为正确答案。什么?一个异步调度和4个方法调用如何?(做同样的事情)递归分派调用是没有意义的。这是无用的开销。“com.unique.name.queue”可能是正确的吗?那你为什么这么叫它?com是什么意思?
let serialQueue = DispatchQueue.init(label: "com.foo.bar")
serialQueue.sync {self.readAllImagesFromPhotosLibrary()}
serialQueue.sync {self.rriteFewImagestoDirectory()}
serialQueue.sync {self.gettingBackAllImagesFromFolder()}
serialQueue.sync {self.moveToNextView()}