5

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

-(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. 这是一个好的设计吗?
4

1 回答 1

2

在回答您的问题时,那些分派到主队列的块按您的预期运行,一切都会正常工作,当应用程序重新回到前台时,您会看到 UI 正确更新。两个警告:

  1. 您需要确保endBackgroundTask在最终调度完成之前不调用 。您可以通过以下任一方式实现此目的:

    • 使最终的 UI 调度同步;或者

    • 将 包含在endBackgroundTask您分派到主队列的最后一个块中作为最后一项。

    但这时机endBackgroundTask很重要,您要确保在将后台任务标记为已完成并指示它可能已暂停之前更新您的 UI。

  2. 我不知道你想如何处理无法完成后台任务,但通常你也会调用endBackgroundTask过期处理程序,否则如果后台任务没有在分配的时间内完成,应用程序将被立即终止. 有关示例,请参阅iOS 应用程序编程指南的在应用程序状态和多任务处理的背景中执行有限长度任务一章。

于 2014-02-26T06:42:21.137 回答