我对面临的情况有一个小问题。
我有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];
    }];

这很容易理解,并使您的代码更加清晰。希望对您有帮助。

10-04 21:18