首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用callback = concurrency执行选择器?

使用callback = concurrency执行选择器?
EN

Stack Overflow用户
提问于 2012-12-03 18:12:47
回答 2查看 1K关注 0票数 1

我有一个关于我面临的情况的小问题。我有两种方法:

代码语言:javascript
复制
- (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循环的链接?方法是否添加到队列中,然后在我调用它们时执行?

我迷路了:)

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-03 18:53:45

异步任务异步运行,它不在主运行循环上运行,而UI在主循环上运行。看一看Concurrency Programming Guide

因此,在您的情况下,您不能真正确定同步时间将花费多长时间。您假设这可能需要10秒,但它并不完全确定。因此,在这种情况下,您需要使用块,或者找到一种在主线程上完成异步任务时触发asyncTaskFinished函数的方法。您可以定义一个简单的块回调,然后在异步任务完成时触发函数。

如果你使用GCD来执行异步任务,这将变得非常容易。你就会做这么多;

代码语言:javascript
复制
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:在异步任务完成时触发完成选择器。对于一个简单的例子,我将向您展示如何实现回调处理程序。你可以像这样创建一个函数来触发异步任务,

代码语言:javascript
复制
-(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();
        });
    });
}

调用它是相对简单的;

代码语言:javascript
复制
[self launchAsyncTaskWithCompletionHandler:^{
        [self asyncTaskFinished];
    }];

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

票数 1
EN

Stack Overflow用户

发布于 2014-01-26 07:07:59

线程的run循环以顺序(非并发)方式执行来自其输入源的任务。因此,只要firstSelectorasyncTaskFinished在同一个run循环中执行,您就不必担心。这将取决于回调语义。您可能需要使用performSelector:onThread:withObject:waitUntilDone:之类的代码来确保异步回调函数在正确的线程中执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13681066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档