# 老司机 iOS 周报 #215 | 2022-08-29

![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) 提出。

## 文章

### 🌟 🐎 [以小窥大：IO 卡顿探寻苹果文件系统](https://mp.weixin.qq.com/s/_bdY3hvd8VBEAfgxmMVf_A)

[@JonyFang](https://github.com/JonyFang)：从一个用户反馈的不寻常的 I/O 卡顿入手，发现苹果 APFS 的一个严重 bug。结合问题场景分析问题，结合数据分析结果，发现苹果的文件操作存在的坑，并给出了相应建议。在日常缓存设计中，也需要留意相应的这些点。

分析问题
- 寻找关键堆栈
- 构造必现代码
- dtrace 分析
- Hopper 分析
- 对比 HFS+

结合已有数据分析，发现苹果的文件操作里存在的坑：
- tmp 在极端情况下可能会存在 >90G 的占用；
- WebKit 随机 + 群众的方式删除网络缓存极端情况下的问题；
- NSURLCache 在 diskCapacity 设置过大时存在的问题；
- 密集删除文件导致 I/O 性能下降过快的问题；

为了避免上述这些极端情况下会导致的 I/O 性能骤降，移动端 APP 也需要合理的设计存储结构。如需要分层管理文件，尽量不将单个文件夹或单个文件搞得过大，同时也需要定时清理临时缓存目录，来进一步优化存储空间占用和优化 I/O 效率。


### 🌟 🐎 [不改一行业务代码，飞书 iOS 低端机启动优化实践](https://mp.weixin.qq.com/s/KQJ5QXHdhwHRN65KdD45qA)

[@Leo](https://github.com/leomobiledeveloper)：在性能优化中，并发是一个常见的手段。但 CPU 核数是有限的，意味着同时能执行的线程数量也是固定的，不合理的并发一方面会带来线程频繁切换的开销，另一方面也会引起一些意料之外的抢占，导致主线程得不到执行。本文结合 Lark 在低端机上的实践，详细地讲解了线程 QoS 优化的原理，对性能优化很有参考意义。

### 🐕 [在 SwiftUI 中用 Text 实现图文混排](https://www.fatbobman.com/posts/mixing_text_and_graphics_with_Text_in_SwiftUI/)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：SwiftUI 提供了强大的布局能力，不过这些布局操作都是在视图之间进行的。当我们想在 Text 中进行图文混排时，需要采用与视图布局不同的思路与操作方式。本文首先介绍一些与 Text 有关的知识，并通过一个实际案例，为大家梳理出在 SwiftUI 中用 Text 实现图文混排的思路。

### 🐎 [响应式编程的复杂度和简化](https://mp.weixin.qq.com/s/7jUGbSmR87FkTRqsm20NFQ)

[@Smallfly](https://github.com/iostalks)：响应式编程思维能够降低异步编程出错的概率，但我们要把它和响应式框架区分开。本文从响应式编程的概念出发，通过具体的代码案例，分析了响应式编程实现的复杂度。最后介绍如何使用 Rx/Combine 和 AsyncSequence 框架对响应式编程代码进行简化，并对这两种实现方式作出了对比。

### 🐕 [基于汇编实现 objc_msgSend hook 方法耗时的方案](https://juejin.cn/post/7134877291716280328)

[@kemchenj](https://kemchenj.github.io/)：测算函数 / 方法执行耗时，对于每一位开发同学来说，似乎都是一道绕不过的坎。

本文通过引入货拉拉移动端研发过程中的痛点，产生方法耗时分析的需求，在调研业内各种分析工具和方案后，结合需求整合出他们的方案，感兴趣的同学可以点击前往阅读。

### 🐢 [【译】本地优先软件 Local-first software](https://www.zxch3n.com/local-first/)

为了追求更好的工具，我们将许多应用程序转移到云端。然而，在云中，数据的所有权属于服务器，而不是用户，因此我们成了自己数据的借用者。在云应用中创建的文件注定会在这些服务的创建者不再维护它们时消失，云服务是无法长期保存的。

在这篇文章中，我们为未来的软件探索了一条新的发展道路。我们展示了用户有可能保留对其数据的所有权和控制权，同时也受益于云相关的功能：无缝协作和从任何地方访问。鱼和熊掌可以兼得。

### 🐎 [Implementing Parts of the Swift Compiler in Swift](https://forums.swift.org/t/implementing-parts-of-the-swift-compiler-in-swift/59524)

[@张嘉夫](https://github.com/josephchang10)：在过去几年中，Swift 编译器的一些组件已经开始用 Swift 实现，包括新的 [Swift Driver](https://github.com/apple/swift-driver)（用于协调 Swift 编译）、[正则表达式字面值](https://github.com/apple/swift-experimental-string-processing/) 的解析、一些新的 [SIL 优化](https://github.com/apple/swift/tree/main/SwiftCompilerSources/Sources/Optimizer) 通道等。但因为某些原因，这些组件都是非必要的。

作者在这篇帖子中提议，开始要求现有的 Swift 编译器能够构建 Swift 编译器，以开启用 Swift 实现编译器中必要部分的大门，同时又避免让开发 Swift 编译器或移植到其他架构变得过于复杂。作者随后还列出了对编译器中用 Swift 实现的必要部分的要求，以及它们的用例，同时还提出了包含 Swift 代码的 Swift 编译器的具体构建流程，以及持续集成等。

### 🐕 [抖音平台多产物代码隔离技术的实践与探索](https://mp.weixin.qq.com/s/fjeF3LLoGsPIQN4D3el67g)

[@Barney](https://github.com/BarneyZhaoooo)：本文主要介绍了利用适配器模式进行代码隔离的整体架构思路和框架的实现思想。

介绍大致分为：
- 设计思想
- 进阶图纸
- 工程视角
- 实战脚手架

### 🐕 [深入解析 Flutter 下一代渲染引擎 Impeller](https://mp.weixin.qq.com/s/GptJbPXPediNRc4KvZzr6g)

[@xuyafei](https://github.com/xiaofei86)：2022 年 6 月在 Flutter 3.0 版本中 Google 官方正式将渲染器 Impeller 从独立仓库中合入 Flutter Engine 主干进行迭代，这是 2021 年 Flutter 团队推动重新实现 Flutter 渲染后端以来，首次正式明确了 Impeller 未来代替 Skia 作为 Flutter 主渲染方案的定位。

在这篇文章中，我们尝试从 Metal 着色器编译方案，矢量渲染器原理和 Flutter Engine 渲染层的接口设计三个维度去探究 Impeller 想要解决的问题和渲染器背后的相关技术。

* Impeller 项目启动背景
* Metal Shader Compilation 演进
* 矢量渲染基础概念
* Flutter DisplayList
* Impeller 渲染流程和架构设计

## 工具

### 🐎 [flutter_impression - Flutter 曝光事件检测工具](https://github.com/623637646/flutter_impression)

[@水水](https://www.xuyanlan.com)：此工具可以方便的检测 Flutter Widget 的曝光事件，目前 Flutter 还没有其他相关的开源工具。
使用起来也很简洁：
```
ImpressionDetector(
  impressedCallback: () {
    debugPrint('impressed'); // 此处可以实现曝光时你要做的任务，比如：埋点等
  },
  child: MyWidget(),
)
```

### 🐎 [ZReviewTender](https://github.com/ZhgChgLi/ZReviewTender)

[@老峰](https://github.com/gesantung)：ZReviewTender 是基于 Ruby 免费开源的 App Reviews 监控机器人工具，可自动监控 App Store iOS/macOS App 与 Google Play App 的使用者最新评论信息，其中 iOS 使用全新的 App Store Connect API 取得评价列表稳定可靠，可使用 Github Repo & Gtihub Action 免费部署。

## 摸鱼周报

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

* 本期话题：Shazam 迎来问世 20 周年
* 本周学习：将 NSImage 转换为 PNG 的方法；在 macOS 中找到以前最前沿的应用程序
* 内容推荐：iOS 基础应用和优化内容推荐
* 摸一下鱼：微软开源表情符大全，软件快捷键速查资源，以及可以制作猫咪插画的网站资源

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 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）
