健康笔记 2.0 开发随笔(五)

发表于

为您每周带来有关 Swift 和 SwiftUI 的精选资讯!

一晃国庆中秋长假即将结束,距离上次的随笔也有了一段时间。在最近的日子里,我一方面继续着开发的进程,同时还要付出相当的精力同 iOS 14 中的各种 Bug 和异常斗智斗勇。

本篇随笔主要记录了这段时间碰到的一些问题,以及聊聊 iOS 14、Xcode 12 以及 SwiftUI 2.0 的一些优缺点。想到哪、写到哪,可能逻辑会比较混乱。

Bug 实在多

2020 年苹果想在软件架构层面做出非常多的重要改变。big sur 要支持 Arm,SwiftUI 要真正做到一套代码顺利的多平台运行,iOS 14 也作出了在近几年肉眼可见的最大变化。不过可能是目标太多、太大,而时间又紧,至少到现在为止,bug 层出不穷,改不胜改。尤其是随着版本的升级,竟然出现了不少前面完全不曾出现的 bug,实在是令人心烦。

比如在 iOS 14.2 beta 2 中,sheet 的 Delegate 无法响应,而在之前的所有版本都没有问题。在 iOS 1 4.2 beta 2 中,View 的刷新时机有和之前有了细微的变化,在一些及特殊的情况下会出现刷新不同步。总之类似的错误一直在增加。

对于 @FetchRequest 中的数据进行修改,View 不会自动更新,尽管 14.2 对于 List 做了修复,但在其他情况下,还是需要人为干预。

@FetechRequest 的数据进行增减时,有时会有动画,有时没有动画。同样的代码,在不同的地方,有时会有动画,有时没有动画,而这些都是在 SwiftUI 1.0 版本都不曾出现的问题。

在 macOS 下通过 catalyst 运行 App 时,总是会出现假死情况(系统 cup 占用为 0,就是 app 没有响应)。

Xcode 12 各种现实异常,这两天出现了一个异常奇怪的现象,当我编辑 xcdatamodeld 文件时,屏幕上出现了一篇白色区域遮盖了数据编辑区,我只能盲操作。而编辑其他任何文件都没有这种情况。

Xcode 12 的代码补全远不如 Xcode 11,总是补全后需要删除大量无用的补全信息。

fileImporter 竟然不能通过手势取消,如果使用手势,会反复弹出 sheet,除非你点击右上角的 cancel

Menu(SwiftUI 新增的控件) 在被键盘遮挡后会出现异常,所以我目前只能把 Menu 放置在屏幕的上方

ContextMenu 点选后总要闪烁一下,让人很不舒服。

在 SwiftUI 2 中,对于键盘的自动避让本来是一个相当不错的设计,但总会导致大量的布局受键盘浮动的影响,反倒需要做更多的工作来避免这种情况,结果是好的想法但实现起来适得其反。

Xcode 12 的 Debug 区域会丢失,可以通过快捷键重新唤出。而且莫名其妙的总是默认不显示右侧的 Debug Output 窗口。

上面所说的都是最近让我特别心烦的一些 bug,其他的实在是太多,就不一一例举了。

bug 过多的结果就是导致我需要花费大量的时间来了判断是我自己的实现错误还是由于系统的 bug 导致的。如果确定是 bug,还需要写不少的 feedback 给苹果,希望它能尽快修复。对于时间的浪费是十分巨大的。

为了判断是什么原因导致的,我目前在 mac 上安装了两个版本的 big sur(最新版、次新版),三个版本的 Xcode (11.7,12.01,12.2 beta 2), 两个运行不同版本的 iphone (14.2 beta 2,14.01), 两个模拟器(14.2,14.01)。总之有够花费精力的。

不过这也是在一个尚未完全成熟的架构下,在一个巨大变化的时间点进行开发所要付出的必要代价。

不小的进步

上面进行了不少的吐槽,下面我们来说说苹果在今年给我们带来的进步和改善。

Xcode 12

preview 已经很成熟了,已经很少会出现崩溃或无法预览的情况。

在 project 嵌入 playground 非常方便,尤其是打开 Build Active Scheme 之后,可以在 playground 中直接使用第三方库。对于开发中进行试验测试提供了巨大的便利。

StoreKit 的模拟环境非常有用,极大的提高了开发应用内付费的效率。可以在不提交 app 并建立资费的情况下便完成和调试所有和收费相关代码。不过我目前发现 restore 好像没有回馈,不知道是我的使用方法不对还是就是没有提供。

全屏开发模式支持直接在一次放置模拟器,提高了屏幕使用率,而且有助于注意力的提升。

SwiftUI liftcycle 让跨平台开发更加便利。

SwiftUI

onChange 是我对于今年 SwiftUI 改动最满意的地方。在 onChange 中的代码运行时机和 View 的 update 一直,基本可以保证正确的响应时机。

新的 DatePicker 在 iOS 上节省了显示的空间,让 form 更紧凑。不过选择后出现的闪烁还表示有进一步优化的空间

众多的新控件。进过我在本次开发中并没有使用太多的新控件,不过更多的选择还是有利于开发者的。

我目前最多使用的新控件有: toolbar menu lazyStack lazyGrid

在 DSL 中支持更复杂的逻辑判断。由于目前支持了 if let, switch 可以在 DSL 中用更少的代码实现更清晰的逻辑处理。

对于复杂的 DSL 的编译能力也有了提高

Big Sur

随着测试版本的不断提高,catalyst 对于 SwiftUI 的支持越来越好。在最初的版本中,基本还是利用 appkit 的控件来代替 uikit 的控件,在目前的 beta 9 下,显示效果已经和 ipad 上相差无几。只是用 SwiftUI + catalyst 来开发 mac app 已经越来越有可能。

测试征集

健康笔记 2.0 目前已经到了收尾阶段,除了图表部分之外,大多数的功能都已完成。我正在申请 test flight 的 beta 测试。如果你有兴趣进行测试,请将你的邮箱发送给我。

健康笔记 2.0 需要运行在 iOS 14 以上的设备。

与全球开发者一同,每周探索 Swift 世界的精彩内容

如果文章对你有所帮助,可以请我喝杯