大多数浏览器和
Developer App 均支持流媒体播放。
-
Foundation 改进
Foundation 框架为 macOS、iOS、watchOS 和 Apple TVOS SDK 中的各种 app 和使用的各种框架提供了一层基础功能。了解关于 Foundation 集合、性能、国际化功能和 Swift 整合的重要增强功能。
资源
相关视频
WWDC19
-
下载
(Foundation进阶) 大家好 我是Tina 我是Foundation团队的 一名工程师 我将会讲解我们为Foundation 添加新API的亮点 现在 我们开始介绍 这些API亮点 我们今天会介绍很多不同的内容
我们从有序集合的diff比较开始 它是一个API 这个API允许你在不同集合之间 计算 编码以及比较之间的差异 我用一个故事来向你们说明 一个bear字符非常 想转换成为bird字符 我们来了解如何实现 (有序集合的diff比较) 我们注意到bird中 没有bear的E和A 它还需要bird中的I和D
那么 我们来移掉E和A 在中间插入一个I 在最后插入一个D
这样我们移除了两个 又增加了两个 来将bear变为bird
使用有序集合diff比较的API 可以非常容易实现
这里的diff是一个集合的 difference类型 它是插入和移除的一个集合 表示插入和移除的元素 以及集合中元素的偏移量 你刚才看到的 它包含了两个 插入和两个移除
我们可以在bear上使用diff 来得到一个新的bird字符串 这是一个非常强大的API 它不仅仅运用于字符串上 任何集合类型都可以 这就是有序集合的diff比较 下面 我们来讲一下数据和连续性 (数据连续性) 你的app可能会在硬盘里创建 图片或其他类型的文件 通常 这些样式的数据 能很容易地在内存中相连区中展示
另一方面 你的app可能使用比如调度数据 或URL会话 从互联网上下载数据 这会产生字节 在不同时间产生多个块 占据内存中的相连区域
在Swift 5以前 数据结构表示连续和不连续区域 这个统一的界面使用起来很简单 但是它也代表将整个缓存 放置底层原始字节 我们需要复制这个区域 到一个连续的区域
这意味着有时候会有无法预知的 行为表现 事实上 我们知道数据真实使用情况 每个不连续的数据 在它的生命周期中有时畅通无阻
所以 从Swift 5开始 我们将结构数据定义为 一个连续的缓存类型 为在语法中施行该协议 我们引入了 ContiguousBytes协议
为了遵循这个协议 这个类型提供以直接 连续的方式进入底层原始字节 所以 你再也不必担心 意外地接触到你的数据了
现在 我们是如何处理其他 不连续的缓存类型的呢?
我们介绍了两个新的协议 将结构数据的界面从独立变为连续 将它推广到不同的缓存类型 我们来看DataProtocol 这是一个字节的集合 MutableDataProtocol 提供了额外的多变性保证
Buffer类型是由Swift 标准库Foundation提供的 调度框架采用了这些协议 你可能已经用过其中的一些类型 包括Data、UInt8数组和 DispatchData
我们建议你也在你的类型或方法 也采用它们 作为一个通用的约束
现在我们来看一下约束
通常 你想要将你的数据 尽可能地变小 你的app可能在有限的 磁盘空间的设备上运行 或者你需要在网上 上传或下载资源
这是一个非常常见的任务 所以我们在Swift上的数据 引入了这个压缩API 它现在很简单 谢谢
它只是一行代码
这个API也支持4种压缩算法 基于速度 内存和压缩率 来为你提供不同的平衡区 我相信你能从中找到 一个最适合你的
(单元) 现在 我们来讲单元 Foundation已经支持了 21种类型来表示通常的物理单元 比如长度 速度和时长
我们扩展了单元时长类型 将亚秒单元提升至了皮秒 这是万亿分之一秒
现在 单元频率类型使用赫兹 来作为基本单元 今年 我们引入了 framesPerSecond 它和赫兹的功能相同 但它非常适合度量设备的FPS
UnitInformationStorage 是一个新的类型 它能被用来表示数码信息的数量
基本单元是位 字节和四位元 通常使用的前缀为 SI-和binary-的单元 从kilo和kibi 到同样支持的yotta和yobi
使用MeasurementFormatter一起 来设计格式 比如数据大小 或使用ByteCountFormatter 一起来做更精准的控制
我们为你提供了更多的格式器 (展示一个日期或时间) 你可能每天都看到过这些字符串 比如 一则你发送的消息状态 一小时前已读 或是明天的一项付款 它是当前展示的 一个相关的日期或时间
它是 对于所有语言环境来说 修正它并不重要 我们引入了RelativeDateTimeFormatter 来协助你
谢谢 和其他格式器类似 返回的字符串是对语言环境友好的 你可以选择的类型有很多 (相对的时间日期格式器) 你想要的另一个样式可能是一个列表 我们也引入了ListFormatter 来为你提供便利 (列表格式器) 它将使用正确的分隔符将 一个列表转变为一个字符串 连接了所有的语言环境
这是另一个例子 一个事件会在 三个不同的日期发生 所以你会想要展现一个像上面的或是 下面的字符串 在你的事件页面罗列出月份
以及 当然 你会想要使用 正确的格式 和不同语言环境的本地化名字来展示 这很重要 因为 比如 在欧洲 通常在书面形式上 日在月的前面
也可用ListFormatter 非常简单地实现
它有一个属性叫做 itemFormatter 规定列表上的每一项的格式 在这种情况下 我想要 格式化列表的日期 我们知道Foundation的 DateFormatter 支持日期格式化 所以 我们使用它作为我们日期的 itemFormatter
这就是我们想要的 完成了 这就是示例底部的本地化字符串
你很容易通过设置DateFormatter 的属性来改变日期形式 ListFormatter适用于 所有的格式器 所以请好好利用它 为你的app提供更好的 本地化字符串
这就是格式器 下面 我们来介绍操作队列 (操作队列) 想象一下 在你的app中 有一些后台任务在同时运行
现在 用户想保存这个运行中app的状态 那么 你要如何实现呢
那么 你想要确认所有运行中的 任务在你能保存之前会结束 所以它可能需要这样实现
你检查当前队列中 运行操作的数量 如果没有 它就说明我们之前规划的任务 一定结束了 所以我们可以保存了 是吗? 不是的 请不要这么做
在它们所有的线程中 其他的任务有可能在同时运行 比如 它在检查之后 保存之前发生
你这里需要的是一个屏障 来保证安全操作 在app状态被保存时 保证没有其他任务在运行
像这样
所以 我们很兴奋地告诉你 操作队列现在支持屏障 你应添加BarrierBlock 在屏障内进行保存操作 这会保证在那段特定的时间 保存操作是唯一在运行的任务 以及 它只会在所有任务运行结束后 执行 在它结束前不会有其他 新任务运行
操作队列另一个更新的点是 进度报告 有时你可能想要追踪你当前 所有任务的所有的进程 在你的UI中展示一个进度栏 你现在可以通过设置操作队列中的 进程属性 totalUnitCount实现 (操作队列) 你在操作队列上加入的 每一个操作 在操作结束后 计数器为所有的 进程创建一个完成单元
接下来是文件系统 (为iOS上的 USB和SMB做好准备) iOS现在支持USB和SMB卷 它是一个网络文件系统 这代表着你应该为处理可能在 其他卷上的文件做好准备 在如下场景 请确保使用FileManager 的itemReplacementDirectory 当你为写入新的文件内容选择地方时 当你操作原子级的安全保存时
接下来 如果用户弹出USB设备 或失去与SMB服务器网络连接 你要在卷完全消失之前做好准备
如果你在读取数据对象时 选择内存映射文件 确保使用mappedIfSafe 为你的读取选项 这会允许系统映射文件至虚拟内存中 但仅当文件处于不可移动的卷时 从USB或SMB盘上读取文件 可能比 内置存储器慢很多
所以 如果你还没有实现它 请将文件系统放置到非主线程里 来保持你的app持续相应
在使用它们之前 你可能需要测试 文件系统的性能 比如 你熟悉的APFS功能 比如克隆 在当你通过USB或SMB 访问其他卷时可能不可用
你可以通过 大量的URL资源关键字事件 或在处理收取错误时做好准备 来测试这些性能
你可以在文件管理 和QuickLook的新功能 的演讲上了解关于它的更多信息
接下来 Swift更新 (Swift更新了扫描仪) 一些Swift的API最开始基于 Objective-C的理念设计 我们这些年在不断提升它们 首先是扫描仪
这是Swift 4上的API 它之前被用来使用NSString
和通过引用返回对象
在Swift 5.1 我们将这个界面简化为了一行代码
以及这个新的API使用了 Swift的字符串类型 字符串是图新的集合 而不是代码点 这意味着使用新的扫描仪的API 你现在能处理复杂的序列 比如颜文字
(SWIFT更新了文件句柄) 另一个提升的地方是文件句柄 它以前被用来处理当错误发生时 在底层的文件描述符抛出异常
今年 我们引入了基于错误的API 现在你能立刻调用站点处理错误
这个为写入数据创建的API 现在也支持数据协议了 它也为非连续数据做了优化
这些就是新API的亮点 我们鼓励你在新的Xcode中 尝试使用这些新的功能 (试一试) 当使用二进制数据创建新方法时 考虑为它们绑定数据协议类型 而不是请求特殊的集合 比如UInt8数组
如果你在UI上以字符串的形式 展示日期或列表
使用RelativeDateTimeFormatter 或一个ListFormatter 来让字符串在每个语言环境都能 正常运行
我们强烈向你推荐操作队列的屏障 来避免竞太条件 如果你使用了一些进程报告机制 转换成操作队列提供的那个吧 谢谢
(更多信息)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。