我对面临的情况有一个小问题。
我有2种方法:
- (void)firstSelector {
[self launchAsyncTask];
... do some work for a long time (10secs) ...
}
- (void)asyncTaskFinished {
... some work after 5secs of async task ...
}
firstSelector
执行launchAsyncTask
,这只是一个后台任务,它具有一个称为asyncTaskFinished
的回调。假设
firstSelector
在启动异步任务后运行了一段时间(假设为10秒),并且异步任务运行了5秒,是否会出现并发问题?这是如何工作的?
会在
asyncTaskFinished
之后执行firstSelector
,还是会暂停firstSelector
来运行asyncTaskFinished
?有运行循环链接吗?方法是否添加到队列中,然后在我调用它们时执行?
我迷路了 :)
谢谢。
最佳答案
异步任务异步运行,而UI在主循环上运行,异步任务不在主运行循环上运行。看看Concurrency Programming Guide。
因此,在这种情况下,您不确定同步时间将花费多长时间。您假设可能需要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];
}];
这很容易理解,并使您的代码更加清晰。希望对您有帮助。