# 老司机 iOS 周报 #286 | 2024-04-22

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

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

## 新手推荐

### 🐕 [Xcode Bookmarks](https://useyourloaf.com/blog/xcode-bookmarks/)

[@Barney](https://github.com/BarneyZhaoooo)：Xcode 15 引入了一种新的代码注释和搜索查询书签功能，用户可以通过选择代码行并使用上下文菜单来创建书签，还可以对书签添加描述、分组和标记完成状态，以及保存搜索查询。这项新功能提高了代码注释和搜索结果的管理效率。

## 文章

### 🐎 [How to define a custom file header for a Swift Package](https://danielsaidi.com/blog/2024/03/21/how-to-define-a-custom-file-header-for-a-swift-package)

[@zoeGuo](https://github.com/zoeGuo)：开发过程中代码的文件头可以包含一些必要信息，Xcode 一般会为我们生成默认的文件头，想要自定义文件头，应该怎么做呢？文章描述了如何为 Swift 包定义一个自定义的文件头，在本地 ` <Package Root>/.swiftpm/xcode/package.xcworkspace/xcshareddata` 目录下添加一个 `IDETemplateMacros.plist` 文件即可，文中例举了 IDETemplateMacros 文件写法。

 ### 🐕 [Actor reentrancy in Swift explained](https://www.donnywals.com/actor-reentrancy-in-swift-explained/)

[@Cooper Chen](https://github.com/cjlcooper)：本文深入解析了 Swift 中的 actor 重入性，这是管理 actor 内并发任务的关键概念。虽然 actor 确保单线程执行，但异步函数带来的挑战在于它们不总是 atomic 地执行。作者通过示例，说明了同时从本地和远程源读取数据可能导致意外结果的原因，而解决方案涉及管理任务以防止冗余网络调用。作者重点提及了在 actor 的异步方法中考虑重入性以避免错误的重要性，因此理解和解决重入性相关问题对于有效地管理并发至关重要，同时作者强调需要谨慎考虑并采用个性化的解决方案来处理重入性问题。

### 🐎 [Splitting Up a Monolith: From 1 to 25 Swift Packages](https://ryanashcraft.com/splitting-up-a-monolithic-swift-package/)

[@Smallfly](https://github.com/iostalks)：这篇文章分享了作者如何将一个大型 Swift 包重构为 25 个较小的包。这个过程中，他解决了对 iCloud 的依赖、代码共享的复杂性、SwiftUI 预览和编译时间问题。通过创建抽象层和依赖注入，成功解耦了核心模型和 CloudKit。

重构后，他将包分为纯可重用和特定于 Foodnoms 的两类，提高了代码的模块化和可测试性。虽然面临日志记录的挑战和应用包大小增加，但整体性能提升，SwiftUI 预览也变得更实用。重构思路具有一定的借鉴意义。

 ### 🐕 [Fetching OSLog Messages in Swift](https://useyourloaf.com/blog/fetching-oslog-messages-in-swift/)

[@极速男孩](https://github.com/ztlyyznf001)：这篇文章介绍了如何在 iOS 应用程序中使用 OSLog 框架实时检索日志。文章通过导入 OSLog 框架和创建 Logger 对象来开始，并说明了如何在应用的不同区域生成日志。关键部分涉及使用 OSLogStore 以及如何设置起始位置和使用 NSPredicate 进行日志过滤，以提高性能。文章还讨论了使用 OSLogStore 时遇到的一些限制，如检索速度慢，并推荐了 Apple 的 SwiftLog 作为替代方案。最后，提供了一个展示日志的 SwiftUI 视图示例，说明了如何异步获取并显示日志。


### 🐎 [Bar Chart creation using Swift Charts](https://www.avanderlee.com/swift-charts/bar-chart-creation-using-swift-charts/)

[@DylanYang](https://github.com/Dylan19Yang)：本文介绍了 Swift Charts 的一些基础用法， Swift Charts 能够帮助开发者更便捷的呈现图表数据。作者以 Xcode 的编译数据作为示例，展现了如何通过 Swift Charts 构建一个柱状图，并能够调整柱状图的展示范围。同时通过 `foregroundStyle`、`chartForegroundStyleScale` 等 modifier， 我们也能轻松的对柱状图进行分组、改变柱状图颜色等操作。


### 🐕 [QQ 9 “傻快傻快”背后的技术秘密](https://mp.weixin.qq.com/s/nVXE0iSllZ3rFei4t7bR7g)

 [@JonyFang](https://github.com/JonyFang)：本篇介绍了 QQ 9 丝滑背后的技术实现，从启动速度，页面刷新，差异算法，预加载和回收，异步布局和渲染等方面介绍了手 Q 在性能方面做的全流程优化，并介绍了几个用户体验提升的场景表现。每一项优化点深入后内容相对复杂，都可以单独拎出来展开说明，文中也提到后续会慢慢分享出来。


## 工具

### 🐎 [Mac App 原生内置 Debug 菜单](https://mjtsai.com/blog/2024/03/22/_eventfirstresponderchaindescription/#comment-4059578)

[@BluesJiang](https://github.com/BluesJiang)：这个是开发 Mac App 的隐藏 Debug 菜单。使用 `UserDefaults.standard.setValue(true, forKey: "_NS_4445425547")` 开启。
开启后会在菜单栏里出现一个 🐞 菜单。这个菜单不依赖 Xcode，跟随 App 启动而启动。它提供了很多方便的辅助，比如 Responder 打印、View Bounds 展示、改变 Appearance 等。推荐尝试。

## 内推

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

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

## 关注我们

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

**关注有礼，关注【老司机技术周报】，回复「2023」，领取 2023 及往年内参**

![](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）
