在不改变控制流的情况下使 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
链接您的操作并设置哪些操作需要其他人完成。这允许您同时 运行 多个操作。
* - 从技术上讲,您 可以 通过阻塞一个线程直到另一个线程完成来做到这一点,但您几乎可以肯定 不应该 这样做那。
我们目前有如下方法:
-(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
链接您的操作并设置哪些操作需要其他人完成。这允许您同时 运行 多个操作。
* - 从技术上讲,您 可以 通过阻塞一个线程直到另一个线程完成来做到这一点,但您几乎可以肯定 不应该 这样做那。