我有一个关于我面临的情况的小问题。我有两种方法:
- (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秒,会不会出现并发问题?
这是如何在幕后工作的?是在firstSelector之后执行asyncTaskFinished,还是暂停firstSelector以运行asyncTaskFinished
是否存在与run循环的链接?方法是否添加到队列中,然后在我调用它们时执行?
我迷路了:)
谢谢。
发布于 2012-12-03 18:53:45
异步任务异步运行,它不在主运行循环上运行,而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];
}];这很容易理解,并使您的代码更加清晰。希望这对你有帮助。
发布于 2014-01-26 07:07:59
线程的run循环以顺序(非并发)方式执行来自其输入源的任务。因此,只要firstSelector和asyncTaskFinished在同一个run循环中执行,您就不必担心。这将取决于回调语义。您可能需要使用performSelector:onThread:withObject:waitUntilDone:之类的代码来确保异步回调函数在正确的线程中执行。
https://stackoverflow.com/questions/13681066
复制相似问题