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

Making Objective-C code asyncronous without changing control flow

我们目前有如下方法:

-(void)DoTask{
   //METHOD 1

   //METHOD 2

   //METHOD 3

  //METHOD 4

}

我们发现了一个错误,修复要求我们确保异步执行方法 3。它发生在整个系统中,所以我们希望有一个简单的修复。有没有一种方法可以将某种类型的包装器方法放在我们需要 运行 异步的代码周围,这样代码流就不需要为 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

}

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

您有几个选择。方法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 链接您的操作并设置哪些操作需要其他人完成。这允许您同时 运行 多个操作。


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