调用 didEnterBackground 后是否可以在主线程上执行某些操作?

2024-04-02

首先,如果您认为我的问题是虚拟的,我想说声抱歉,我是 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
    }
  }
}

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


首先,我建议您考虑提供的这份文件Apple https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background。 该文件本身很清楚,但我将仔细阅读它以提取与您的问题相匹配的重要信息。

在本文档中,苹果明确表示每个暂停的 UI 任务都将被丢弃,并且您不应该将新任务提交到 Dispatch 队列,您应该挂起当前队列并释放资源ASAP.

当应用程序需要停用时,有两个步骤:

  1. 系统调用应用程序applicationWillResignActive(_:)方法(或sceneWillResignActive(_:)如果您使用sceneDelegate)
  2. 然后UIKit调用applicationDidEnterBackground(_:)方法(或sceneDidEnterBackground(_:))

第一步,UIKit 会通知您有关停用的信息,这意味着应用程序将在几次后进入后台。 在执行此步骤时,您必须保存所有敏感数据。

在此步骤中,如果您暂停了 UI 任务,则所有这些任务都将被丢弃。

当系统需要暂时中断应用程序时(例如,显示系统警报),系统还会停用应用程序

在此步骤中,您必须暂停正在运行的任务,正如苹果所说,您应该让您的应用程序安静

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

  • 暂停调度和操作队列。

  • 不要安排任何新任务执行。

  • 使任何活动的计时器无效。

  • 自动暂停游戏。

  • ...

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

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

我也建议学习这个文件 https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle关于应用程序状态有助于理解应用程序状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用 didEnterBackground 后是否可以在主线程上执行某些操作? 的相关文章

  • 处理ios设备方向

    我的 uiview 遇到问题 具体取决于设备方向 我遇到的主要问题是 UIDeviceOrientationFaceUp UIDeviceOrientationFaceDown 扰乱了我的视图 我只想支持纵向和横向 左右 因此如果设备改变方
  • 我们如何在 swift 中使用 NSSelectorFromString ?

    我不明白为什么这总是失败 有什么帮助吗 显然 我不明白如何NSStringFromSelector作品 下面是我的代码 class ViewController UIViewController override func viewDidL
  • iOS 的 IAP 收据验证

    我正在开发一个客户端 服务器应用程序 它使用 Apple 的 IAP 和 StoreKit 框架来购买订阅 我们希望客户 iPhone 或 iPad 能够使用 StoreKit 框架通过其 iTunes 帐户向 Apple 进行初始订阅购买
  • Xcode 代码覆盖率和 fopen$UNIX2003

    我面临着一个似乎相当广泛的问题 当我使用 Lion 激活 Xcode 4 2 1 中的代码覆盖率时 它显示以下错误 Detected an attempt to call a symbol in system libraries that
  • ios 无法将图片上传到服务器

    您好 我正在尝试将图像从我的 IOS 设备上传到服务器 这是我上传图像的代码 IBAction btnUpload id sender if self imageViewGallery image nil UIAlertView Error
  • iOS7:我们可以在 Dynamic Type 中使用 Helvetica Neue 以外的字体吗?

    我们正在为 iOS7 设计一个应用程序 我们的设计师想要使用非默认字体 Avenir 但我不想失去动态类型功能 据我了解 动态类型只能与默认系统字体 Helvetica Neue 一起使用 是否可以使用其他字体 或者目前无法选择 据我了解
  • 除了推送收据之外,关闭 FireBase 调配还会影响分析吗?

    The Firebase 云消息传递文档 https firebase google com docs cloud messaging ios client说他们混合了一些方法来获取推送通知令牌并记录接收推送通知 在里面FIR 分析文档 h
  • 在屏幕外绘制 uiview

    我想创建一个 UIView 它在调用 ViewDidLoad 时位于屏幕外 但一旦调用某个函数 我就会将其动画显示到屏幕上 用于对 UIView 进行动画处理的代码很好 但我似乎无法从屏幕外绘制 UIView 我已将故事板中的 UIView
  • 使用Combine,如何在网络请求后取消分配订阅

    如果您使用组合来处理网络请求URLSession 那么你需要保存Subscription 又名 AnyCancellable 否则它会立即释放 从而取消网络请求 稍后 当网络响应被处理后 您想要取消分配订阅 因为保留它会浪费内存 下面是执行
  • Captive Wifi 弹出窗口:单击链接打开 Safari

    我们的 iOS 设备 ipad iphone 等 网络出现问题 连接到 SSID 后 iphone ipad 立即打开强制网络助手 CNA 它就像一个缩小版的浏览器 没有导航按钮等 显示我们的欢迎页面 准备好让用户在网络中验证他的 MAC
  • 文件是为存档而构建的,这不是正在链接的体系结构(i386)

    我必须构建静态库 我想在我的 iPhone 和 iPad 应用程序中使用 当我尝试运行模拟器时 出现链接错误 我是 iOS 开发新手 请帮忙 ld 警告 忽略文件 Users valuelabs Desktop DruvaProject l
  • Xcode 11 向后兼容性:“UIWindowScene 仅在 iOS 13 或更高版本中可用”

    在 Xcode 11 中 我从 Single View App 模板创建了一个新的应用程序项目 我希望这个应用程序能够在 iOS 12 和 iOS 13 中运行 但是当我将部署目标切换到 iOS 12 时 我收到了很多类似这样的错误消息 U
  • 如何在 iOS 中将 NSData 变量转换为 NSInteger 变量

    我有以下返回的 api 方法NSData 我在另一个视图控制器中调用了这个方法 如何转换NSData to NS整数 NSData getBusXMLAtStop NSString stopnumber NSMutableURLReques
  • 检查url图片是否存在

    我正在尝试使用 if 语句检查 url 图像是否存在 然而 当尝试通过错误的图像网址测试它时 它会不断返回 致命错误 在解包可选值时意外发现 nil code var httpUrl subJson image url stringValu
  • AVAudioSessionPortBluetoothHFP、A2DP 和 LE 有什么区别?

    Apple 中记录了三种不同的蓝牙相关音频端口类型AVAudioSessionPort 描述 https developer apple com library ios documentation AVFoundation Referenc
  • 在 iOS 上保存(私人)应用程序设置?

    我知道NSUserDefaults用于保存 恢复user优先 什么是等效类应用 例如 应用程序可能有一个 上次运行 字段 或者它可能有一个用于在应用程序级别使用的设备的唯一标识的字段 我的目的是将应用程序的设置 而不是用户的设置 保留在设置
  • 在 iPhone 应用程序中获取路线和路线导航

    我正在开发一款应用程序 该应用程序将重点关注在驾驶时为用户提供路线和逐段指示 他们在驾驶过程中留在应用程序中非常重要 因此我真的不想让他们离开应用程序并转到内置的地图应用程序 我最近对如何包含此功能进行了大量研究 众所周知 这并不容易 因为
  • 无法识别的选择器发送到类

    我已经看到 这是一个常见问题 但我自己找不到任何解决方案 这是代码 class ButtonViewController UIViewController override func viewDidLoad super viewDidLoa
  • didDeselectRowAtIndexPath indexPath 为 nil

    我有一个表视图控制器 它实现了 TableView 委托方法 public override func tableView tableView UITableView didSelectRowAtIndexPath indexPath NS
  • 在 iOS 上使用 OpenGL ES 2.0 进行实例化绘制

    简而言之 谁能确认是否可以使用内置变量gl InstanceID or gl InstanceIDEXT 在 iOS 上使用 OpenGL ES 2 0 的顶点着色器中GL EXT draw instanced启用 Longer 我想使用绘

随机推荐

  • 如何绑定到正在运行的android服务?

    我希望这更多的是代码问题 而不是其他问题 我希望有人可以帮助解决这个问题 我还有其他使用 startService 启动服务的代码 并且当调试器点击 DecoderService 的 onCreate 函数时 我可以验证该服务是否已启动 但
  • 如何(优雅地)使用 Q 中断 Promise 链执行

    我有一连串的承诺 如下所示 module exports deleteCommunityFollower function deleteCommunityFollower req res var communityId req params
  • C# WinForms TreeView 删除水平滚动条

    我需要一个只有垂直滚动条的 TreeView I tried this http social msdn microsoft com Forums en US winforms thread 4aa4dade 53a2 4e2e a8b4
  • 为什么我的应用程序从本地化资源中获取错误的字符串?

    我创建了三个本地化文件 en ru uk 我看到问题应用程序可以得到一些字符串正确和一些字符串错误 这是什么意思 例如 一种布局在其工作过程中可以包含多个语言环境 而不是一个语言环境 这是错误的 我看到一些用户通过添加几行代码来解决这个问题
  • 什么更快?结构体数组或数据表

    我正在使用 LinqToSQL 处理来自 SQL Server 的数据 并将其转储到 iSeries 服务器中以进行进一步处理 更多详细信息请点击此处 https stackoverflow com questions 2410466 sp
  • GC 会从元空间收集垃圾吗?

    我一直认为垃圾收集器只清除堆 现在我也这么认为 在java 8中permGen被删除并被Metaspace取代 据我了解元空间是垃圾收集的 https stackoverflow com a 24075360 2674303 https s
  • 在Python交互窗口VSCode中交换shift-enter和回车

    In the interactive window in vscode you press shift enter to run the code you just typed and enter to go to the next lin
  • 为什么compareTo返回一个整数

    我最近在一个 SO 聊天中看到了一个讨论 但没有明确的结论 所以我最终在那里询问 这是出于历史原因还是与其他语言的一致性 在查看签名时compareTo各种语言 它返回一个int 为什么它不返回枚举 例如 在 C 中我们可以这样做 enum
  • 创建对象的数组列表

    如何用对象填充 ArrayList 并且其中的每个对象都不同 ArrayList
  • Kafka 0.8,是否可以使用java代码创建带有分区和复制的主题?

    在 Kafka 0 8beta 中 可以使用下面提到的命令创建主题here http kafka apache org 08 quickstart html bin kafka create topic sh zookeeper local
  • 如何每隔 n 个字符或最近的前一个空格分割字符串

    我想每 15 个字符 包括空格 插入一个换行符 我目前正在使用下面的正则表达式 它在某种程度上起作用 但它占用了单词后最近的空格 并且我想要最近的前一个空格 有任何想法吗 const split str replace s S 15 g 1
  • 拆分 ng 重复项?

    简单的问题 如果我的控制器中有这个 scope somedata Item 1 Item 2 set from something else 有没有办法在 ngRepeat 表达式中分割我的视图的一些数据 就像是 div item div
  • ApiController Post 中的 Async 和 Await

    我仍然不太清楚 net 4 5 中的 async 和 wait 到目前为止 我想我明白了等待 将函数 在其右侧 放在单独的线程上 将执行返回给当前函数的调用者 但会 劫持 当前函数代码的其余部分 直到等待 异步 函数完成 如果我误解了什么
  • 当前上下文中不存在名称“...”

    我的里面有一个清单Main 我正在尝试从变量中将一个项目添加到该列表中 但它抛出了错误 名称 dogList 在当前上下文中不存在 在我的里面addDog 方法 dogList Add 由于上述原因无法正常工作 namespace Dogg
  • postgresql 的 mysql_insert_id 替代品

    有没有替代方案mysql insert id PostgreSQL 的 php 函数 大多数框架通过查找 ID 中使用的序列的当前值来部分解决问题 但是 有时主键不是串行列 从 PostgreSQL 的角度来看 用伪代码来说 insert
  • Android 中的上传和下载速率分析[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试开发一个 Android 应用程序来测量网络的上传和下载速度 我可能需要每 2 秒左右运行一次并对其进行分析 SpeedTe
  • return Json 函数没有更新我的下拉列表

    我有一个包含填充下拉列表的视图 我添加了一个按钮 以便用户可以在 jquery 模式中添加新的下拉列表值 因此当用户单击添加新的下拉列表值时 我想刷新下拉列表 但目前没有任何更新 这是我对下拉列表的看法 model Communique M
  • 调用方法出错,启动jvm失败

    我正在使用 javafx v8 0 40 开发桌面应用程序 我用inno 5创建了一个exe文件 当我在计算机中运行exe文件时 它已安装并运行 没有任何问题 另一方面 当我尝试在其他计算机上安装并运行它时 在安装结束时 会弹出窗口对话框
  • 创建文件系统“驱动程序”

    我想为 Windows 物理磁盘上的自定义文件系统创建一个 驱动程序 我不完全知道解释它的最佳方式 但该设备已经具有适当的驱动程序以及 Windows 与之通信的所有内容 但我希望用户能够将设备插入到他们的电脑 将其显示在 我的电脑 中 并
  • 调用 didEnterBackground 后是否可以在主线程上执行某些操作?

    首先 如果您认为我的问题是虚拟的 我想说声抱歉 我是 iOS 和多线程的新手 只是想了解事情是如何发生的 据我所知didEnterBackground是 iOS 在应用程序挂起之前调用的最后一个函数 应用程序有大约 5 秒的时间从中返回 否