# 老司机 iOS 周报 #243 | 2023-05-08

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/ios-weekly.png?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### [Foundation Package 预览版发布](https://www.swift.org/blog/foundation-preview-now-available/)

[@kemchenj](https://kemchenj.github.io/)：去年周报曾经提到 [Foundation 将使用 Swift 重新实现](https://github.com/SwiftOldDriver/iOS-Weekly/blob/9f5f9487a469fd33d0c39f3434107f77987946c0/Reports/2022/%23227-2022.12.12.md?plain=1#L10)，近日 Swift 开发团队发布了预览版，日期相关的功能性能对比当前版本的 Foundation 提升 20%-150%，而 JSONDecoder/JSONEncoder 的性能提升甚至达到 200%-500%。

2023 年上半年会继续集中在核心 API 的实现和测试的补齐，下半年则会集中在导入现有的 Foundation API，例如 URL/Bundle 等，并且过程中也允许通过提案加入小部份全新的 API。

一句话总结，Swift is the new Foundation。

## 文章

### 🐕 [心遇 iOS 端会话页性能优化 — ReactiveObjC 实践篇](https://mp.weixin.qq.com/s/_nYM42vgSEqlJuoMlPdCUw)

[@享耳先森](https://github.com/iblacksun)：`ReactiveObjC` 是 `Objective-C` 下的响应式编程框架，可以将各种通知、代理等转换成事件流进行分发，`Swift` 下有 `RxSwift` 及 `Combine`。本文介绍了「心遇」团队如何使用 `ReactiveObjC` 解决项目中逻辑分散的问题。

> Tips: 开发者们在上手  `RAC` 类库前建议先评估学习曲线及维护、调试问题。

### 🐕 [Notifications: why less is more — how Facebook has been increasing both user satisfaction and app usage by sending only a few notifications](https://medium.com/@AnalyticsAtMeta/notifications-why-less-is-more-how-facebook-has-been-increasing-both-user-satisfaction-and-app-9463f7325e7d)：

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：Facebook 的通知数据科学团队的成员，针对用户对通知的感受进行了调查。最终的结论我相信 Facebook 以外的其他数据科学团队也可以从中受益。他们发现，在更少的通知体验中，用户会更多的使用 Facebook，用户行为的转变需要很长时间，更少的干扰会导致更高的自然使用率，从高提高用户满意度和程序使用率。需要注意的是，长期试验可能会显示出与短期实验不同的结果，甚至结果截然相反，因为人们需要时间来适应变化。


### 🐕 [十年“屎山”终重构，但 QQ 选用了微软 Teams 放弃的 Electron](https://mp.weixin.qq.com/s/f6M1w2kX0jhYgasIWwsawg)：

[@Damien](https://github.com/ZengyiMa)：本文不是技术文章，主要介绍了 QQ 全新的 NT 技术架构，QQ 凭借 NT 架构实现了 QQ 多平台架构的统一，而 QQ NT 技术的一个重点就是使用 Electron 作为新版 QQ 桌面端 UI 跨平台解决方案。有意思的是，在同一时刻，微软 Teams 正在放弃的 Electron，对跨平台开发感兴趣的同学不妨一读。

### 🐎 [MainActor usage in Swift explained to dispatch to the main thread](https://www.avanderlee.com/swift/mainactor-dispatch-main-thread/)

[@J_Knight_](https://github.com/knightsj)：本文介绍了 MainActor 的概念和使用方法。首先介绍了它的概念：它是 Swift 5.5 中引入的一个新属性，它提供一个在主线程上执行任务的执行器，使用 ``@MainActor`` 属性将帮助你确保你的 UI 总是在主线程上更新。MainActor 是一个全局唯一的 Actor，他在主线程上执行他的任务。它应该被用于属性、方法、实例和闭包，以在主线程上执行任务。然后结合代码示例介绍了它在不同场景下的使用方法。


### 🐕 [开源图像模型 Stable Diffusion 入门手册](https://mp.weixin.qq.com/s/8czNX-pXyOeFDFhs2fo7HA)

[@老驴](https://weibo.com/u/6090610445)：最近大热的除了 ChatGPT 这样的大语言模型之外，Stable Diffusion 这样的图像模型也受到了广泛关注。而且因为图像模型相对来说比较容易在自己的机器上跑，所以很多同学都跃跃欲试，想要部署在自己的机器上来体验效果。 这篇来自腾讯技术的文章是个很不错的给初学者的入门文章，从零开始带你一步一步部署图像模型。有兴趣的同学可以来学习一下。

### 🐎 [veImageX 演进之路：iOS 高性能图片加载 SDK](https://mp.weixin.qq.com/s/JClQbL9D3PftGuw2H_KXXw)

[@Smallfly](https://github.com/iostalks)：本文主要介绍了 veImageX iOS 客户端图片加载 SDK，它的核心功能包括：

- 网络加载：默认支持原生网络库与自研网络库，不仅做了一些网络相关优化，而且支持最新的网络协议 QUIC，也提供了精细粒度的网络监控；
- 图像解码：支持苹果原生图片格式，以及社区其它主流的图片格式解码，全系统支持 HEIF 格式；
- 图片处理与变换：图片加载完成后，除了对图片进行装饰，还支持超分，实现低分辨率传输，高分辨率显示；
- 日志上报：包含图片性能日志、用户感知日志、大图监控日志，配合工作台可以全方位监控图片各项指标。

除了基础的功能模块，该 SDK 还进行了一系列的性能和体验优化，提升图片加载体验，优雅控制内存，以及动图播放优化。目前该 SDK 以开放平台的方式提供收费服务。

### 🐕 [快手 Swift 历险记之 Clang Module 带来的“坑”](https://mp.weixin.qq.com/s/RarmJgRWiINE87feMAMaaA)

[@老峰](https://github.com/Gesantung)：本文主要介绍了快手接入 Swift 后开启 Clang Module 后所遇到的问题如编译错误、Module 编译慢、PCH 编译优化失效、Module 复用率低 & 过期导致编译失败等，以及对应的解决方案 Clang 关闭 Clang Module ，原理非常简单，主要是打破了接入 Swift 过程中的一些经验“误区”。

### 🐕 [Debug iOS app in Visual Studio Code](https://yrom.net/blog/2023/04/22/debug-ios-app-in-vscode/)

[@JonyFang](https://github.com/jonyfang): 本篇主要介绍了在 VSCode 中调试 iOS app 的过程。主要内容结构：

1. 使用 LLDB 远程调试程序，简述大概的原理。
2. VSCode 调试 ios app 代码。必要的插件能力介绍及配置。
3. 调试 XCTest。介绍了 vsc 的相关配置及原理。
4. 调试带宿主 app 的 XCTest。通过反射或者 dlsym 直接调用 XCTestCore 等私有 Framework 的符号，创建 XCTestDriver 进而调用 XCTestCase。

通过本文，可以了解到 VSCode 如何自定义 tasks 和 launch configurations，跟着实践，也可以深入了解到 lldb 调试程序的原理。

### 🐕 [Yielding accessors in Swift](https://trycombine.com/posts/swift-read-modify-coroutines/)

[@zoeGuo](https://github.com/zoeGuo)：多任务协同在开发中会经常遇到，当多任务处理中遇到 copy-on-write types 和 dynamic properties 时，协同生成器就能起到很大的作用了。在 Swift 中协同生成器 _modify 和 _read 方法配合 yield 关键字，在多任务协同工作时体现出的显著性能优势，包括数据处理速度以及内存使用大小。文章详细举例验证了使用协同生成器后的性能提升，但 _modify 和 _read 两个方法还有 _ 标识，意味着还在 work-in-progress 的阶段，而 yield 关键字目前也只能在 nightly toolchains 中使用 , 期待尽快在 Swift 新版本中看到更新。

### 🐕 [链接器优化 : 相同代码折叠 ICF](https://zhuanlan.zhihu.com/p/484176002)

[@AidenRao](https://weibo.com/AidenRao)：ICF 是链接器的一项优化技术，在链接阶段把有相同实现的 C++ 方法合并链接到同一个地址。由于 C++ 模版会生成大量相同实现的方法，所以这个技术在 C++ 代码中有很好的安装包优化效果。  
相关阅读链接：
- [Safe ICF: Pointer Safe and Unwinding aware Identical Code Folding in the Gold Linker](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/36912.pdf)
- [LLD for Mach-O: The Journey](https://llvm.org/devmtg/2022-05/slides/2022EuroLLVM-LLD-for-Mach-O.pdf)


## 工具

### [ETTrace](https://github.com/emergeTools/ettrace)

[@Leo](https://github.com/leomobiledeveloper)：ETTrace 是 emergeTools 开源的用来分析代码耗时的工具。实现原理是在 App 内启动一个子线程定时获取主线程的函数堆栈，然后把这些堆栈生成 json 上传到网站以火焰图的方式供开发者分析。逻辑上这种方式比 Instrument 更精确，因为 iOS16 开始，dyld4 会进行预计算 protocol conformances 来优化启动耗时，但 Instrument 的实现方式是用 DYLD_INSERT_LIBRARIES，导致这个优化被禁用了。


## 代码

### [Compose Multiplatform](https://github.com/JetBrains/compose-multiplatform/#readme)

[@极速男孩](https://github.com/ztlyyznf001)：Compose Multiplatform 是一个基于 Kotlin Multiplatform 的跨平台 UI 开发框架，旨在简化和统一 Android、iOS、桌面和 Web 应用程序的用户界面开发。它的核心概念源于 Jetpack Compose，这是 Google 推出的现代 Android UI 工具包，支持使用 Kotlin 编写声明式 UI 代码。在最近的 Alpha 版本中迎来了 iOS 的支持。

## 摸鱼周报

[@摸鱼周报 #92](https://mp.weixin.qq.com/s/AQaY2DA2h8S-XEYoQ0u7Ew)：第 92 期摸鱼周报来了，一起来看下本期概要：

* 本期话题：Swift Foundation 预览版发布；App 无障碍功能线上讲座
* 内容推荐：一些优秀博文，涵盖：Mirror API、网络可达性优化、SwiftLint 等方面的内容。
* 摸一下鱼：最全 AIGC 工具集；AI 领域几个开源项目；HuggingChat 发布；陆奇演讲总结

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2021」，领取 2017/2018/2019/2020 内参**

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
