首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UIBackgroundTaskIdentifier中调度对主队列的调用

在UIBackgroundTaskIdentifier中调度对主队列的调用
EN

Stack Overflow用户
提问于 2014-02-26 06:01:28
回答 1查看 483关注 0票数 5

我在UIBackgroundTaskIdentifier下运行一个特定的任务,因为我想在后台运行它。我的代码看起来像这样。

代码语言:javascript
复制
-(void) function
{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

        UIBackgroundTaskIdentifier BGIdentifier = [[UIApplication sharedApplication]   beginBackgroundTaskWithExpirationHandler:^{}];     

        // some processing

        dispatch_async(dispatch_get_main_queue(), ^{
            // some UI stuff
        });

        // some processing again

        dispatch_async(dispatch_get_main_queue(), ^{
            // some UI stuff again
        });

        [[UIApplication sharedApplication] endBackgroundTask:BGIdentifier];        
    });
}

所以我有两个问题。

  1. 如果我的应用程序在进行一些处理时转到后台,那么对主队列的dispatch_async调用会发生什么呢?
  2. 这是个好设计吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-26 06:42:21

在回答您的问题时,那些发送到主队列的块按照您的预期操作,一切都会正常工作,当应用程序重新进入前台时,您将看到UI被正确更新。两个注意事项:

  1. 您需要确保在完成最后的分派之前不会调用endBackgroundTask。您可以通过以下两种方法来实现这一目标:
代码语言:javascript
复制
- Make that final UI dispatch synchronous; or
- Include the `endBackgroundTask` as the last item in the last block you dispatch to the main queue.

但是这个endBackgroundTask的时间很重要,您需要确保在将后台任务标记为完成之前更新UI,并指出它可能被挂起。

  1. 我不知道如何处理后台任务的失败,但通常您也会在过期处理程序中调用endBackgroundTask,因为如果后台任务在分配的时间内未完成,则应用程序将立即终止。有关示例,请参阅App的在后台执行有限长度任务。和iOS应用程序编程指南中的多任务处理一章。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22033080

复制
相关文章

相似问题

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