18

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

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

[self ReadAllImagesFromPhotosLibrary];

[self WriteFewImagestoDirectory];

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView];
4

6 回答 6

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状态排队并串行运行。syncasync之间的区别在于,使用sync,您的代码将在运行以下代码之前暂停并等待块回答,因此如果执行时间很长,则可能会冻结您的 UI。而使用异步代码运行并异步返回块。

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

于 2014-11-28T09:44:08.300 回答
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 操作在主线程中执行。希望能帮助到你。

于 2013-07-02T09:10:08.830 回答
1

您可以使用NSOperationQueuewith maxConcurrentOperationCountset to 1 (甚至为每个 NSOperation 设置依赖项,因此它不会在其依赖项完成之前启动)。

这是NSOperationQueue类参考。

也看看这个问题。

于 2013-07-02T09:08:23.607 回答
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   
}  
于 2013-07-02T10:18:33.437 回答
0

为什么不试试GCD呢,它保证了操作的顺序,还有同步和异步的能力

于 2013-12-26T00:31:06.157 回答
-2

在 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()}
于 2016-11-16T05:49:46.453 回答