我正在构建一个iOS应用程序,该应用程序在后台线程上做了一些繁重的工作。

我使用创建线程

  dispatch_queue_t backgroundQueue;
  backgroundQueue =  dispatch_queue_create("MyQueue", NULL);

然后使用以下命令将其放入GCD:
   dispatch_async(backgroundQueue, ^
  {

   //some heavy operations here
   //each of them might run for >1 sec

  }

我只想顺序执行队列,前提是它不会阻塞主线程。
如果在20毫秒内从方法3,方法2和方法1调用了该块,则它们必须按3-> 2-> 1的顺序执行,因为每种方法的输出都被下一个用尽。

我是GCD的新手,天真地想象调度队列将使用FIFO队列执行顺序调用。但是,在当前的实现中,它远非顺序的。

我尝试使用NSLock,但它们也无济于事。

我想知道在GCD中强制执行顺序执行的适当机制。

编辑1:

我声明一个全局队列:
 dispatch_queue_t backgroundQueue ;

并在viewDidLoad()中启动它:
 backgroundQueue = dispatch_queue_create("MyQueue", DISPATCH_QUEUE_SERIAL);
 //using DISPATCH_QUEUE_SERIAL was a new idea, I also tried using NULL

我正在使用GCD基本上在另一个类中调用方法:
 -(void)doAction()
  {

   dispatch_async(backgroundQueue, ^
        {
                   MyOtherClass *obj = [[MyOtherClass alloc] init];
                   [obj heavyMethod1:  param1 : param2];
                   [obj release];
               });

        }

 -(void)doAnotherAction()
  {

   dispatch_async(backgroundQueue, ^
        {
                   MyOtherClass *obj = [[MyOtherClass alloc] init];
                   [obj heavyMethod2:  param3 : param4];
                   [obj release];
               });

        }

现在,根据情况,可以从许多其他方法中调用doAction和doAnotherAction方法。

我在这里看到的是-如果我按以下顺序调用这些方法:: doAction-> doAction-> doAnotherAction-> doAction

...我按如下顺序获得输出:: doAction-> doAnotherAction-> doAction-> doAction

如何保持其调用顺序并同时保持顺序?

附言:-如果我删除GCD并允许事情在主线程中进行,则理论上来说它运行良好-在模拟器中。 (它在iPhone中崩溃。)

最佳答案

在这个线程中似乎有很多困惑-为了尝试减轻这种情况,让我首先说明一些有关GCD的基本事实:

  • 串行队列始终以串行和非并行方式执行项目(项目在同一队列中)。甚至没有办法使GCD在串行队列中“从任何地方取东西”,所以那里似乎有些困惑。
  • 并发队列可以以任何顺序和任意数量的并发线程执行提交给它们的块。除非您将队列创建为并发队列或使用全局并发队列之一,否则不会出现此现象。
  • dispatch_async总是立即返回,而不管将工作发布到的队列的类型,因此,如果您有多个方法将工作发布到同一串行队列中并且这些方法是从多个调用的,则很有可能以不可预测的顺序交错工作在您的代码中!例如,您有doAction和doAnotherAction方法,但尚不清楚它们在何处被调用,并且由于每个方法都可能立即或多或少地返回,因此您可以轻松地看到提交的doAction/doAction/doAnotherAction链。

  • 如果希望同时执行多个操作,但每个操作都以可预测的顺序进行,则应为每个“事物”创建一个串行队列-这是通常维护(不锁定)关键资源的独占访问的方式-每个资源都有自己的关联串行队列。

    这更有意义吗?

    10-08 12:16