在不改变控制流的情况下使Objective-C代码异步

时间:2015-03-06 01:03:19

标签: objective-c multithreading asynchronous

我们目前有以下方法:

-(void)DoTask{
   //METHOD 1

   //METHOD 2

   //METHOD 3

  //METHOD 4

}

我们发现了一个错误,修复程序要求我们确保方法3执行异步。它发生在整个系统中,因此我们希望能够进行简单的修复。有没有办法在我们需要运行Async的代码周围放置某种类型的包装器方法,这样代码流不需要为main方法更改?非常喜欢:

-(void)DoTask{
   //METHOD 1

   //METHOD 2

   //WRAPPER START AROUND METHOD 3 TO MAKE IT ASYNC
   //METHOD 3
   //WRAPPER END AROUND METHOD 3 AFTER ASYNC HAS FINISHED FOR CODE TO GO ONTO METHOD 4

  //METHOD 4

}

1 个答案:

答案 0 :(得分:1)

你不能*那样做(你所描述的将是同步,而不是 asyncronous )。

您有几个选择。在方法3的异步操作完成后,您可以调用方法4:

-(void) doTask{
    //METHOD 1

    //METHOD 2

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //METHOD 3

        dispatch_async(dispatch_get_main_queue(), ^{
            //METHOD 4
        });
    });
}

您也可以先调用方法4.

您还可以使用NSOperationQueue来链接您的操作并设置哪些操作需要其他操作完成。这允许您同时运行多个操作。


* - 从技术上讲,你可以这样做,通过阻止一个线程直到另一个线程完成,但你几乎肯定不应该这样做。