大多数浏览器和
Developer App 均支持流媒体播放。
-
提高效率:SwiftUI 中的“后台任务”
“后台任务”可帮助 App 对系统事件做出反应,使时间敏感型数据保持最新状态。了解如何利用 SwiftUI 后台任务 API 简洁明了地处理任务。我们将介绍如何利用 Swift 并发来处理网络响应、后台刷新等等,同时保持性能及其他功能。
资源
相关视频
WWDC22
WWDC21
-
下载
♪ 柔和乐器演奏的嘻哈音乐 ♪ ♪ 欢迎收看 “静候高效:SwiftUI 的后台任务” 我是 watchOS 框架团队 的工程师 John Gallagher 本期视频将介绍 一个全新 SwiftUI API 该 API 可运用 Swift 并发性 来处理后台任务 且在 Apple 的所有平台上 都能够平稳运行 首先 我们将以一款名为 Stormy 的 App 作为示例 该 App 专用于 在暴风雨天气拍摄天空 其中就用到了后台任务 接着 我们将深入了解 App 是如何使用后台任务的 后台任务又是如何在幕后工作的 接下去 我们将介绍 如何使用新的 SwiftUI API 来处理后台任务 最后是回顾该 API 如何通过运用 Swift 并发性 将后台任务简化到了前所未有的程度 新的 API 在多种平台通用 如 watchOS iOS tvOS Mac Catalyst 和小组件 包括运行于 Mac 的 iOS App 也就是说 您学会在一个平台 处理后台任务后 其概念和模式也适用于其他平台 新 API 通过 Swift 并发性 减少了深度嵌套的 完成处理程序及回调的需要 因此也自然而然地 减少了大部分可变状态 有了 Swift 并发性原生的 任务取消功能 App 能够以合适方式 及时完成任务 不必被系统关闭后台进程 我们所开发的这款 名为 Stormy 的 App 适合爱好拍摄云层的用户 该 App 能够在 风雨即将到来的时候 提醒用户拍摄时机 如果当天有暴风雨 该 App 将在中午显示通知 提醒用户拍摄天空 用户只需要点击通知 就能够拍摄天空 并将照片上传到个人资料 以供日后欣赏 这张照片将在后台上传 上传完成后 该 App 会再次通知 让我们深入了解下 后台任务是如何做到的 我们将运用这张图表 站在更高层次观察 看看如何运用后台任务 做到只在暴风雨天气发送通知 我们将用左边的进度条 表示 App 的前台运行时间 中间的进度条表示 App 后台运行时间 右侧的则是系统运行时间 当该 App 第一次被前台启动时 这是我们的第一个时机 可以安排一个中午时 后台刷新 App 的任务 由此 当 App 因用户退出被暂停时 系统将按照预定的时间 在后台再次唤醒我们的 App 我们把任务安排在中午 这样系统就会 按时在后台唤醒 App 并发送后台 App 刷新任务 安排好了后台运行时间 接下来 我们需要弄清楚 外面是否是暴风雨天气 确认后再向用户发送通知 一开始 我们将向天气服务 发出网络请求 来检查当前天气 URL 会话已经安排在后台 App 可以暂停 以等待网络请求完成 当获取天气数据的请求 在后台完成后 我们的 App 将 使用新的 URL 会话任务 在后台继续运行 有了天气数据请求的结果 我们的 App 就知道了 是否有暴风雨天气 并且可以选择是否发送通知 来提醒用户拍摄天空照片 现在 那个 URL 任务的工作 已经完成 系统可以再次暂停 App 让我们继续深入 看看单个后台任务的详情 看看它是如何工作的 为此 需要仔细观察 单个 App 刷新 后台任务的生命周期 来把这里放大一点 首先 系统会唤醒我们的 App 并向其发送 App 刷新后台任务 然后 我们在后台继续发出网络请求 查看外面是否为暴风雨天气 理想情况下 在分配给该 App 刷新 的后台运行时时间内 网络请求就能完成 得到网络响应后 就可以立即发布通知 通知发出后 刷新期间需要做的事情都已完成 系统可以再次暂停 App 但是 如果获取天气数据的请求 没有及时完成呢? 如果 App 在处理当前任务时 后台运行时间不足 系统会向 App 发出 时间不足的信号 提醒我们好好处理这种情况 如果在后台运作时间结束之前 App 尚未发出任务完成信号 App 可能会被系统退出 也无法发送未来的后台任务请求 在这种情况下 应该要 确保我们的网络请求 是后台网络请求 才能够立即完成 App 刷新任务 然后再次唤醒 来争取额外的后台运行时间 直到网络请求完成 后台 URL 会话安排下去后 系统可以再次暂停 App 接下来 让我们深入了解 SwiftUI 的后台任务 API 是如何帮助我们 构建 Stormy 的 首先 我们需要一个基础 App 然后 我们将编写一个函数 来让后台 App 在明天中午刷新 先创建一个代表明天中午的日期 接着创建一个 后台 App 刷新请求 最早开始日期为明天中午 将其提交给调度程序 这样 就能够让系统在明天中午 唤醒 App 我们想要在用户 第一次打开 App 时 以及每天中午请求天气数据的时候 调用这个函数 我们可以使用 新的后台任务场景修饰符 来注册一个和已安排后台任务 相对应的处理程序 当 App 收到后台任务时 使用此修饰符注册的块会开始运行 而该修饰符必须 与收到的后台任务匹配 在本例中 我们使用的 任务类型是 appRefresh 该类型可以提前安排 来为 App 在指定日期 提供一定的后台运行时间 请求和后台任务修饰符中的处理程序 使用相同的标识符 这样能够在您的 App 收到相应任务时 让系统识别出要调用的处理程序 为了能够保证 下一天继续安排任务 我们将通过调用刚刚编写的 scheduleAppRefresh 函数 来启动我们的后台任务 好在明天中午 再次安排后台运行时间 现在 安排在中午的 后台任务再次启动了 提出网络请求 检查外面是否有暴风雨 并使用 Swift 关键字 await 来等待结果 那么 如果网络请求返回后显示 确实是暴风雨天气 就可以等着向用户发送通知 提醒他们上传天空照片 当我们的闭包体返回时 系统分配给我们 App 的 底层后台任务 将被隐式标记为完成 系统可以再次暂停我们的 App 使用 Swift 并发性 可以在有需要时 进行需要长时间操作的后台任务 且无需在工作完成时 进行显式回调 Apple 平台上的许多 API 例如添加通知 已经支持将 Swift 并发 用于异步操作 这是照片 notifyForPhoto 直接就可以使用 使用的异步添加通知方法 可以在 UserNotificationCenter 找到 让我们深入说说 该如何在一些 繁重工作中应用 Swift 并发性和异步/等待 让处理后台任务变得比以往更容易 还是使用本期的示例 让我们编写异步 isStormy 函数 异步功能需要发出网络请求 来检查外面的天气 首先 我们将获得 共享的 URL 会话 并实例化对天气数据的请求 URL 会话 采用了 Swift 并发 并且可以从异步上下文中等待的网络 下载数据 有了网络响应 我们可以读取天气数据并返回结果 但是当我们的 App 无法运行时间到期之前 完成网络请求的话该怎么办呢 回想一下 在这种情况下需要保证 已经将 URL 会话 设置为后台会话 并确保其将使用 URL 会话后台任务 把启动事件发送到 App 回到代码 我们使用了共享的 URL 会话 相反 我们这次应该从后台配置 创建一个 URL 会话 且将 sessionSendsLaunchEvents 属性设置为 true 以此 即使 App 暂停 也能让系统 运行部分网络请求 然后唤醒 App 继续完成 URL 会话后台任务 请注意 这在 watchOS 上尤为重要 因为在 watchOS 上 后台 App 的所有网络请求 都必须通过 后台 URL 会话进行请求 不过 目前为止还没有完成 回想一下 当后台任务运行时到期时 系统将取消异步任务 而该任务正在运行 提供给后台任务修饰符的闭包 这意味着 后台运行时到期时 从这里发出的网络请求也将被取消 为了对任务取消进行响应和处理 我们可以使用 Swift 并发内置的 withTaskCancellationHandler 即 任务取消处理程序函数 而不是单单等待结果 我们将下载放入 withTaskCancellationHandler 的调用中 和其他的一起等待 传递给 withTaskCancellationHandler 的第一个块 是我们想要运行和等待的异步过程 第二个尾随闭包的 onCancel 是将运行的代码 当任务被取消时 看这里 当即时网络请求 由于运行时间到期被取消时 将网络请求提升为后台下载任务 可以用于调用恢复 触发即使 App 暂停 也会继续运行的后台下载 此代码没有发出两次底层网络请求 因为背后使用的是 相同的 URL 会话 而 URL 会话将在后台删除 重复的进程中请求 最后 需要确保 App 已完成设置 以处理后台 URL 会话的启动 我们可以再次使用后台任务修饰符 但这次是 URL 会话任务类型 通过使用和之前的 后台 URL 会话 配置相同的标识符 我们可以确保这个块只在 特定的 URL 会话产生 后台任务时被调用 我们已经深入了解了 用于处理后台任务的 全新统一 SwiftUI API 也知道了 Swift 并发性 如何简化了 管理任务完成和到期的过程 有关 Swift 并发的更多信息 请查看 WWDC 2021 讲话 “Swift 中的异步/等待” 要了解更多 SwiftUI 并发性相关信息 推荐收看同样是 WWDC 2021 讲话的 “在 SwiftUI 中发现并发” 感谢收看 “静候高效:SwiftUI 的后台任务” ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。