【问题标题】:Simple GCD Serial Queue example like FIFO using blocks简单的 GCD 串行队列示例,例如使用块的 FIFO
【发布时间】:2013-06-29 13:50:03
【问题描述】:

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

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

[self ReadAllImagesFromPhotosLibrary];

[self WriteFewImagestoDirectory];

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView];

【问题讨论】:

  • 如果您对以下任一答案感到满意,请将其标记为正确答案。

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


【解决方案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()}

【讨论】:

    【解决方案2】:

    要跟进和改进 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。而使用 async代码会继续运行,并且块会异步返回。

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

    【讨论】:

      【解决方案3】:
      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 操作在主线程中执行。希望对您有所帮助。

      【讨论】:

      • 什么?一个调度异步与 4 个方法调用怎么样? (做同样的事情)
      • 递归调度调用是没有意义的。这是无用的开销。
      • “com.unique.name.queue”可能是对的吗?还是为什么要这样命名? com 是什么意思?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我不太了解现有的 API 用于对块执行相同操作(如果有)。

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

        sn-p 用于以串行方式执行块

        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   
        }  
        

        【讨论】:

          【解决方案6】:

          您可以使用 NSOperationQueue 并将 maxConcurrentOperationCount 设置为 1(或者甚至为每个 NSOperation 设置依赖项,因此它不会在其依赖项完成之前启动)。

          这里是NSOperationQueue 类参考。

          另请查看this 问题。

          【讨论】:

            猜你喜欢
            • 2012-12-17
            • 2011-06-03
            • 2018-08-24
            • 1970-01-01
            • 1970-01-01
            • 2016-06-04
            • 2014-01-20
            • 2012-06-12
            • 2013-10-11
            相关资源
            最近更新 更多