异步任务异步运行,它不在主运行循环上运行,而 UI 在主循环上运行。查看并发编程指南。
因此,在您的情况下,您不确定同步时间需要多长时间。您假设它可能需要 10 秒,但并不完全确定。因此,在这种情况下,当异步任务在主线程上完成时,您将需要使用块或找到一种方法来触发 asyncTaskFinished 函数。您可以定义一个简单的块回调,然后在异步任务完成时触发该函数。
如果你使用 GCD 来执行异步任务,它变得非常容易。你会做这么多;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self runMyAsyncTask];
// trigger the main completion handler when this completed
dispatch_async(dispatch_get_main_queue(), ^{
[self asyncTaskFinished];
});
});
如果您使用 NSThread 进行并发,您可以使用 performSelector:onThread: 在异步任务完成时触发完成选择器。对于一个简单的案例,我将向您展示如何实现一个回调处理程序。您可以创建这样的函数来触发异步任务,
-(void)launchAsyncTaskWithCompletionHandler:(void(^)(void))completionHandler{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self runMyAsyncTask];
// trigger the main completion handler when this completed
dispatch_async(dispatch_get_main_queue(), ^{
completionHandler();
});
});
}
并且调用它相对简单;
[self launchAsyncTaskWithCompletionHandler:^{
[self asyncTaskFinished];
}];
这很容易理解,并使您的代码更加清晰。希望这对您有所帮助。