调用didEnterBackground后是否可以在主线程上执行某些操作? 首先,我想说对不起,如果你考虑我的问题哑,我是新的iOS和多线程,只是想了解事情的进展。据我所知,didEnterBackground是iOS在应用程序暂停之前调用的最后一个函数,应用程序有大约5秒的时间从中返回,否则iOS将终止应用程序。我目前正在考虑这样一种情况——我有一些任务正在后台线程上进行(例如网络下载),它的完成块发生在主线程上。像这样 fun downloadData() { Downloader.download(url: "someUrl") { [weak self] in // download is on the background thread DispatchQueue.main.async { [weak self] in // switch to main // do some stuff } } }

调用didEnterBackground后是否可以在主线程上执行某些操作? 首先,我想说对不起,如果你考虑我的问题哑,我是新的iOS和多线程,只是想了解事情的进展。据我所知,didEnterBackground是iOS在应用程序暂停之前调用的最后一个函数,应用程序有大约5秒的时间从中返回,否则iOS将终止应用程序。我目前正在考虑这样一种情况——我有一些任务正在后台线程上进行(例如网络下载),它的完成块发生在主线程上。像这样 fun downloadData() { Downloader.download(url: "someUrl") { [weak self] in // download is on the background thread DispatchQueue.main.async { [weak self] in // switch to main // do some stuff } } },ios,swift,multithreading,ios-background-mode,ios-multithreading,Ios,Swift,Multithreading,Ios Background Mode,Ios Multithreading,downloadData()当前正在后台线程上运行,用户点击home按钮,应用程序进入后台并调用dienterbackground。当主线程执行didEnterBackgrounddownloadData中的代码时,下载完成并调用其完成,新任务被推送到主线程队列中。那么在这种情况下会发生什么呢?由于dienterbackground中的代码是在暂停之前可以执行的最后一个代码,downloadData的完成块会发生什么情况,它是否也会在暂停之前执行(在dienterbackground之后),还是

downloadData()
当前正在后台线程上运行,用户点击home按钮,应用程序进入后台并调用
dienterbackground
。当主线程执行
didEnterBackground
downloadData
中的代码时,下载完成并调用其完成,新任务被推送到主线程队列中。那么在这种情况下会发生什么呢?由于
dienterbackground
中的代码是在暂停之前可以执行的最后一个代码,
downloadData
的完成块会发生什么情况,它是否也会在暂停之前执行(在
dienterbackground
之后),还是在用户返回应用程序后执行,或者它会被丢弃?还是这种情况根本不可能?谢谢您的帮助,再次抱歉,如果我的问题是不正确的。

首先,我建议您考虑这份文件提供。 文档本身很清楚,但我会仔细阅读,以提取与您的问题相匹配的重要信息

在本文档中,苹果明确表示,每个暂停的UI任务都将被丢弃,您不应向调度队列提交新任务,您应暂停当前队列并尽快释放资源

当应用程序应该被停用时,有两个步骤:

  • 系统调用应用程序
    applicationWillResignActive(:)
    方法(或
    sceneWillResignActive(:)
    ,如果您使用
    sceneDelegate
  • 然后UIKit调用
    ApplicationIdentinterBackground(:)
    方法(或
    ScenedIdentinterBackground(:)
  • 在第一步中,UIKit将通知您停用,这意味着几次之后,应用程序将进入后台。 执行此步骤时,必须保存所有敏感数据

    在此步骤中,如果已挂起UI任务,则所有这些任务都将被丢弃

    当需要临时中断应用程序时,系统也会停用应用程序,例如显示系统警报

    在这一步中,你必须暂停你的跑步任务,正如苹果公司所说,你应该让你的应用程序安静下来

    • 将用户数据保存到磁盘并关闭所有打开的文件

    • 暂停调度和操作队列

    • 不要计划执行任何新任务

    • 使任何活动计时器无效

    • 自动暂停游戏

    在第二步中,当UIKit通知你的应用程序转移tp后台状态时,你必须尽快释放共享资源,如果你坚持使用这些资源,你的应用程序将被终止

    因此您问题中提到的UI任务将被丢弃。

    我还建议研究应用程序状态,这有助于理解应用程序状态