gpt4 book ai didi

objective-c - 在 UIBackgroundTaskIdentifier 中调度对主队列的调用

转载 作者:太空狗 更新时间:2023-10-30 03:53:59 24 4
gpt4 key购买 nike

我正在 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. 这是一个好的设计吗?

最佳答案

在回答您的问题时,那些分派(dispatch)到主队列的 block 会按您预期的那样运行,并且一切都会正常运行,并且当应用程序返回前台时,您会看到 UI 已正确更新。两个注意事项:

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

    • 使最终的 UI 同步分派(dispatch);或者

    • endBackgroundTask 作为您分派(dispatch)到主队列的最后一个 block 中的最后一项。

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

  2. 我不知道您想如何处理无法完成后台任务的情况,但通常您也会在过期处理程序中调用 endBackgroundTask,否则应用程序将如果后台任务没有在分配的时间内完成,则立即终止。查看Executing a Finite-Length Task in the Background iOS 应用程序编程指南应用程序状态和多任务处理一章的示例。

关于objective-c - 在 UIBackgroundTaskIdentifier 中调度对主队列的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22033080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com