Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 iOS 周报 #292 | 2024-06-10

11 Jun 02:02
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

🌟 【老司机技术出品】 WWDC24 内参目录(更新中)

今年我们如期带来 Session 的汇总,并会在每天推送当天新放出的 Session ,欢迎大家关注更新。

文章

🌟 🐕 What Does spacing = nil Mean in SwiftUI? 

@zoeGuo:作者通过探讨子视图间不一致的间距问题,深入分析了 spacing 参数的默认值 nil 所代表的含义。作者从“是什么”、“为什么”、“怎么用”的角度,分析了 SwiftUI 中 spacing 的构成和原理。对开发者在处理复杂布局、追求 UI 细节时有很大帮助,掌握一些 spacing 技巧也能帮助实现一些用传统方法难以达到的布局效果。

🐎 How Do You Know Whether or Not SwiftUI Previews and Preview Content Are Excluded From App Store Builds?

@Kyle-Ye: 部分同学写 Preview 代码可能没有加 #if DEBUG 的习惯,理想情况下也确实不用加。Preview 代码不会被实际上游代码引用,因此直觉是不用 #if DEBUG 也不会出现在最终代码中。本文介绍了目前 SwiftUI Preview + Xcode 的一些 bad case,并建议大家目前对于 Preview 代码还是保持写 #if DEBUG

🐎 Do NOT init State externally in SwiftUI

@JonyFang: 这篇文章详细解析了为何不应在 SwiftUI 中外部初始化 State,并提供内联初始化的正确姿势及其他解决方案,避免视图更新问题。

🐎 Swift 集成 KSCrash IOS 崩溃跟踪

@kemchenj:本篇文章讲解了在 Swift 项目中集成 KSCrash 进行 iOS 应用崩溃日志跟踪的方法,并提供了将日志输出到指定文件的解决方案。作者详细介绍了 KSCrash 的配置和自定义输出文件的实现步骤,包含代码示例,帮助开发者更好地管理和分析应用崩溃信息。

推荐人:PBK-B

🐕 Boost Performance by Over 100x Using the Accelerate Framework

@BluesJiang:这篇文章简单介绍了苹果自带的框架 Accelerate 的应用范围和作用。因为 Accelerate 框架是比较集中在数据特定领域的加速框架,比如视频、图片、音频、科学计算等,所以了解的人不多。本文给出了他们使用 Accelerate 框架的两个应用,并且已经开源,发现这个框架相比于市面上泛用的 C++ 框架有这个更好的计算性能和能效优势,解决了他们在使用常规并行计算时依旧会产生的延迟,并且也显著降低了内存消耗。这个得益于 Accelerate 针对苹果设备的高度优化,并且是苹果自己也在使用的高性能计算框架。
如果你也有类似的实时计算需求,不妨研究一下这个框架,说不定有意外之喜。

🐎 Designing a Declarative API

@DylanYang:本文作者通过开发一个对用户输入进行验证的 Validator 的例子,一步步为大家揭示了如何去设计一个声明式风格的 API。对于不太了解声明式编程的同学来说 SwiftUI 就是一个非常典型的声明式的开发框架。作者对于设计声明式 API 的一个重要思想就是,我们应该优先聚焦在最终的代码应该如何被展现的逻辑和结构上,然后才轮到讨论具体的控制流。同时作者也通过例子证明了声明式编程可以和 UI 无关,也并不一定意味着包含链式调用。

🐕 几个在 SwiftUI 中使用惰性容器的技巧和注意事项

@AidenRao: 这篇文章介绍了在 SwiftUI 中使用惰性容器的几个技巧和注意事项。惰性容器如 List 和 LazyVStack 在展示大型数据集时非常高效,它们只在需要时动态构建和加载视图,从而提升应用性能和内存利用效率。文章提到了自定义遵循 RandomAccessCollection 协议的数据类型,以优化数据源的性能和内存使用。此外,还介绍了实现无限数据加载的方法,以及 id 修饰器对 List 懒加载机制的影响等。这些技巧和注意事项能够使开发者在 SwiftUI 中保持流畅的用户体验和高效的资源使用。

代码

🌟 🐕 ZippyFormat

@EyreFree: ZippyFormat 是一个更快版本的 NSString stringWithFormat 方法,在 iOS 端可以显著提升字符串格式化的性能。它通过直接将格式化参数追加到 char* 缓冲区,并仅在最后创建 NSString 来优化性能。ZippyFormat 还利用堆栈来避免 NSMutableString 产生的中间堆分配。此外,它在追加格式化参数时无需执行验证,因为已经知道数据是有效的 UTF-8。对于常见的 %@ 参数如 NSNumber、NSDictionary、NSArray 等,ZippyFormat 通过直接复制已知的输出到缓冲区,避免了调用 [object description] 的开销。总的来说 ZippyFormat 通过在较低层次上操作,避免了 Apple 原生实现中不必要的抽象和验证,从而显著提升了字符串格式化的速度。它是一个非常值得尝试的性能优化工具。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #291 | 2024-06-03

03 Jun 02:31
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

明天我们就将推送 《WWDC24 内参》的报名信息,希望参与创作的同学不要错过哦~

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

文章

🌟 🐕 深入理解内存分配

@莲叔:内存问题一直是 iOS 平台上最常见的稳定性问题,尤其在以 OC 为主的应用中。我们在排查野指针崩溃的问题时遇到的难点往往是崩溃点和问题点往往不在一起。这篇文章通过分析 iOS 平台内存分配的原理来非常严谨的解释了这个现象的原因,非常值得大家学习。之后作者还提出了一种定制内存分配策略的实现方式,对于精细化的性能分析或者特定应用场景分配优化都是不错的方向。

🐕 🌟 Tricking iOS Into Animating App Icons

@水水:如何让你的 APP 图标动起来?这是一个很有意思的事情,文本作者从系统提供的切换 APP 图标 的 API 实现中,一步步通过反编译,解决了弹框提醒、进入后台等问题,实现了 APP 的动态图标。并附带有 Github Demo 实现 AnimatedAppIcons,效果如下:

🐕 Copy on Write Performance Measurements

@Kyle-Ye: 24 年 04 月 15 日期推荐的 COW 库后续,作者使用 Benchmarks 和 Instruments 对他的 COW 库进行了详细的性能评估。对性能评估和 COW 细节感兴趣的读者欢迎阅读。

🐢 Build your next website in Swift

@DylanYang:本文作者借由 WWDC 2019 上苹果用来介绍 result builders 的 HTML 风格的代码作为引子,一步一步地展示了如何通过 Swift 的各种语法构建出一个类 HTML 风格的开发框架,并最终输出 HTML 代码,使得 Swift 开发者可以不必精通 HTML 就可以通过 Swift 写出 HTML 代码。同时写 Swift 代码相比直接写 HTML 又有更好的编译校验,提高了可靠性。在这个过程中,作者也介绍了 result builders 的用法和它的一些特性。最后作者揭示了这个框架的整体构思过程,当你回看时会发现这其实和 SwiftUI 如出一辙。

🐕 Always correct gradient text in UIKit

@Barney:这篇文章提供了在 UIKit 中为 UILabel 创建渐变文本的解决方案。初始方法是通过 UIImage 生成 UIColor,但存在问题:当 UILabel 的 frame 大于文本内容时,渐变显示不完整。解决方案包括使用 AutoLayout 居中渐变或设置合适的约束,或者使用 UIStackView 子类来自动布局,确保渐变正确渲染。文章强调,渐变渲染应作为最后步骤进行,以适应当前文本的边界。此方法也适用于 UITextView。

🐢 一文搞懂七种基本的 GC 垃圾回收算法

@Crazy:本篇文章是一篇非常详细的关于 GC 算法的讲解文章,仔细的阅读本文不仅可以让你理解现有的七种基本的 GC 算法,更可以应用在面试中,让你在面试中给面试官留下深刻印象。本文先介绍了 GC 算法的起源与基本概念,其中主要讲解了 GC 算法的性能评价标准。基础讲解完之后本文开始详细讲述了 GC 的七种基本算法的原理与改进方法,其中包括:标记-清除法、引用计数法、GC 复制算法、标记-压缩算法、保守式 GC 、分代垃圾回收、增量式垃圾回收。在文章的最后作者更是用一张图来简明扼要的对七种算法进行了对比,将各个算法的优缺点都写在了表格之中。本文是一篇值得大家反复仔细阅读的文章,无论是工作中还是面试中对大家都会有很深的帮助。

音视频

WWDC Index

@EyreFree: WWDC 会议的非官方索引,包含 2000 年至 2023 年 3430 次会议的资源,以及各种技术讲座,比较完整。此网站不隶属于苹果公司,所有内容仅供参考。感兴趣的同学可以收藏学习。

Developing An Inclusive Mindset

享耳先森: 如果你的产品在考虑或已经做了无障碍适配,建议看看这个视频。作者 David Smith 是独立开发者,开发了 Pedometer Plus+ 等应用,视频里重点介绍了他对 包容性设计 的认知发展过程:无障碍适配不仅仅是 Accessibility API 适配这么简单,而应该从更全局的角度来审视整个设计。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #290 | 2024-05-27

27 May 02:24
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

Incorrect bundle purchase payments: Fixed!

作者 5 月初发现苹果从 24 年 2 月起,对于应用内包含了 App 套装销售(Offering app bundles) 的 App ,会少给予开发者一份原本 App 的购买费用,即:错误地从 App 套装销售 的购买收益中两次减去了之前购买的应用程序的价格。

在作者提交了反馈后,苹果回电问题已被发现,所有受影响的开发者将得到对应损失的补偿。

文章

🐢 探讨跨平台技术与跨平台 UI 框架及 Kotlin Multiplatform 在 bilibili 的实践

@JonyFang: 本文以相对客观的事实数据比对了目前移动领域的多个跨平台语言的横评,也相对主观的针对当前的大环境下的一些跨平台技术的思考及 B 站的选型做了一些解读。希望可以为读者开阔思路,也希望如果能拉拢到同样观点的大佬们共同一起反哺基于 Kotlin 跨平台的生态的建设。从而做到社区全局收益。后续 B 站会持续继续输出关于 KMP 技术的技术及实践的深度文章,也会持续关注跨平台技术的发展,希望能够在这个领域有更多的交流。

🐎 Is Dynamic Isolation Bad?

@zoeGuo:文章讨论了 Swift 并发中的动态隔离与静态隔离的区别和应用。静态隔离通过使用像 nonisolated,isolated,actor, 和 global actor 这样的关键字来标记类或代码块,确保它们在编译时就定义好运行环境,是由编译器来处理的隔离。动态隔离使用运行时结构如锁来实现,需要在运行时正确地协调。文中举例用两种方式实现原子性,静态隔离固然安全,但动态隔离灵活便捷,要选择合适的方式解决并发问题。

🐕 Faster Git checkouts on NFS and SSD with parallelism

@AidenRao: 本篇文章主要介绍在大型存储库上使用并行 checkout 功能,此功能可将某些 checkout 操作在 SSD 上的速度提高 3.6 倍,在 NFS 挂载上的速度提高 4.5 倍。且所有使用到 checkout 机制的 git 命令都能收益,包括:clone, reset, switch, restore, merge 等。

🐕 计算机系统篇之链接(15):共享库拦截技术之运行时库打桩

@Damien: 本文主要讨论了 Linux 系统中的运行时库打桩技术,这是一种允许截获对共享库函数的调用,取而代之执行自己代码的技术。文章详细解释了运行时库打桩的实现原理,以及如何在加载程序时拦截标准库的 API(以 malloc/free 为例)的实现过程。

Scaling ChatGPT: Five Real-World Engineering Challenges

@老驴:这篇文章是采访了来自 OpenAI 的 Evan Morikawa,讲述了他们在爆炸增长的用户量下,是怎么解决一些难以解决的问题工程问题的。

他主要提到了下面的几点:

  1. KV 缓存和 GPU RAM 的管理。
  2. 批处理大小的优化。
  3. 正确的度量指标。
  4. 寻找 GPU 资源。
  5. 缺乏自动扩展的能力。

这些问题在比较早期的公司都比较容易遇到,但是像 OpenAI 这次这么快速爆炸的用户量增长,应该也算是比较少见的了。如果对 OpenAI 感兴趣的同学,建议读一读原文。

代码

HandVector

@BluesJiang:这个是一个在 VisionOS 平台上实现手势识别的开源库。主要是通过 ARKit 拿到手部骨骼节点后,通过余弦相似的算法,来评估手部骨骼节点与目标手势的相似度,以此来支持手势识别。还可以预先录制自己期望的手势作为匹配目标,实现任意手势的识别和匹配。
本开源库还介绍了一种如何在模拟器中调试手势识别算法的方法,因为官方模拟器并没有提供访问摄像识别手势的能力。方案主要是使用 Google 的 MediaPipes 来代替 Vision Pro 真机上的手势识别能力,然后将数据投入 Swift 代码中进行测试。
这个也是少有的在 Swift Native 侧开源的基础算法仓库之一,可以提供参考和借鉴。

【 iOS 】 Apple 增强现实(Apple Augmented Reality)「上卷」「下卷

@Smallfly:这是一本 raywenderlich 出品的 AR 教程,国内的同学翻译。这本书是为初中级 iOS 开发者设计的,旨在帮助读者使用 Swift 构建苹果平台上的沉浸式增强现实(AR)体验。

书中涵盖了以下主题:

  • Reality Composer & Reality Files: 学习如何使用 Reality Composer 创建 AR 体验,以及如何使用 Reality Converter 和 USDZ 文件。
  • RealityKit: 一个用于构建丰富 AR 体验的框架。
  • Facial Blend Shapes: 学习如何使用面部融合形状来创建反应用户面部表情的 AR 面具。
  • ARKit: 苹果的 AR 开发框架,用于创建交互式 AR 体验。
  • Raycasting & Physics: 学习如何在 AR 应用中使用射线投射和物理引擎。
  • ECS & Collaborative Experiences: 探索如何创建多人共享的 AR 体验。

书籍分为多个部分,每个部分都通过项目来教授特定的技能和概念。例如,使用 Reality Composer 创建交互式虚拟鼓套件,使用图像锚点和跟踪创建交互式 AR 商务名片,以及使用 RealityKit 和面部跟踪创建类似 Snapchat 的面部滤镜应用等。

如果你对 AR 开发感兴趣,可以直接访问提供的链接。

【 iOS 】并发(Concurrency)

@DylanYang:这是一本 raywenderlich 出品的 iOS 并发(Concurrency)教程,国内的同学翻译。这本书能够帮助 iOS 初学者理解并发的概念,并且快速上手实践。需要注意的是,这本书中讲述的并发是以 GCD(Grand Central Dispatch)实现的,而非最新的 Swift 并发框架(Swift Concurrency),考虑到 GCD 依然是当前的主流,这本书非常值得一读。

书籍分为多个章节,详细解释了并发的概念,以及 GCD 和 Operations 的原理和实际使用的方式。本书使用了诸多的代码示例使读者便于理解,尤其是最后通过 CoreData 的案例展现了并发如何在实际中应用。除此之外,本外也讲述了如何通过 Thread Sanitizer 来分析并发中常见的数据竞争问题。

整体而言,这是一本内容翔实的并发教程,感兴趣的读者可以收藏后反复品读。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #289 | 2024-05-20

20 May 02:13
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

有很多朋友最近在后台留言询问 WWDC 24 内参的相关事宜,今年的内参老司机技术会继续主办,还请大家放心,我们会在合适的时间邀请大家共同参与今年的内参创作!

文章

🐕 SE-0436: Objective-C implementations in Swift

@kemchenj:Swift 团队最近提出了提案 SE-0436,可以用 Swift 来实现 Objective-C 的 Category/Extension,并且让调用者对此毫无感知,就像是 Objective-C 实现的那样,但这个功能的必要性在哪?

  1. 对于大型混编项目来说,Swift 生成的 Header 会严重拖慢增量编译的速度,这一点在 #242 期的 抖音 Swift 编译优化 - 基于自定义 Toolchain 编译提速 60% 里有详细的说明,如果是通过这个功能去实现的话,就可以绕开这个问题
  2. Swift 自动生成的 Header 文件可读性很差,对于习惯了将 Header 文件作为文档阅读的 Objective-C 工程师来说是灾难般的存在
  3. 可以给 Swift 提供更 Swifty 的接口,WebKit 早在这个提案之前就用上了这个功能,给 WKSLinearMediaPlayer 加上了 var isLoadingPublisher: AnyPublisher<Bool, Never> 等接口,试想一下如果底层使用的是 Objective-C 实现的话,那这样 Swifty 的接口可能就很难实现了

🐕 【 Just For Fun 】 C - 宏开发 - 选取第 n 项参数、按照参数数目展开不同的宏、缺陷

@Barney:这个系列文章深入探讨了 C 语言宏的高级应用,从可变参数函数的基础用法,到宏定义中参数的选择和计数,再到延迟展开技术,逐步展示了宏在 C 语言中的灵活性和强大能力。文章通过具体示例,详细解释了如何构建能够根据参数数量动态展开的宏,以及如何利用延迟展开来优化宏的行为。这些技巧不仅增强了对 C 语言宏机制的理解,也为宏编程提供了新的视角和解决方案。

🐢 每个程序员都应该了解的硬件知识

@xuyafei86:在追求高效代码的路上,我们不可避免地会遇到代码的性能瓶颈。为了了解、解释一段代码为什么低效,并尝试改进低效的代码,我们总是要了解硬件的工作原理。于是,我们可能会尝试搜索有关某个架构的介绍、一些优化指南或者阅读一些计算机科学的教科书(如:计算机组成原理)。但以上的内容可能都太过繁琐、细节太多,在阅读的过程中,我们可能会迷失在纷繁的细节中,没法很好地将知识运用到实践中。本文旨在通过多个可运行的 benchmark 介绍常见的优化细节以及与之相关的硬件知识,为读者建立一个简单、有效的硬件心智模型。

🐎 存储空间终于算“对”了

@Smallfly:这篇文章分析了 iOS 系统中 App 显示存储空间与系统显示不一致的问题,并探讨了造成差异的四个主要原因:App 自身大小、进制差异、口径差异和统计路径差异。文章通过实验验证了 iOS 存储空间的显示口径,并介绍了快手 App 如何通过技术改进实现与系统显示对齐,增强了用户体验和信任。

🐎 Flutter 3.22 发布,快来看看有什么更新吧?

@Crazy:本篇文章主要介绍了 Flutter 3.22 中更新的一些主要功能与性能优化。JsonCodable 因该是所有 Flutter 开发者比较期待的一个功能了,Json 的序列化问题一直都是 Flutter 的大麻烦,需要借助 build_runner 生成 Dart 代码来解决。有了 JsonCodable 以后会大大加速 Flutter 开发者的开发效率。本次 Flutter 更新还将 Vulkan backend 和 Wasm Native 两个功能实现了落地,让 Web 的渲染速度得到了巨大的提升。剩下更多的更新可以在文章中浏览。

代码

🌟 🐎 时隔五年,IGListKit 迎来 5.0.0 版本更新

@zvving:时隔五年,Instagram 团队隆重推出了 IGListKit 的 5.0.0 版本(4.0.0 版本的发布时间还是 2019 年 11 月)。这个新版本整合了近年来 Instagram 对 IGListKit 进行的所有增强,引入了后台 diffing 功能,对 scrollToObject: 方法进行了改进,增加了对 Mac Catalyst 的支持,并提供了 IGListAdapter 等更丰富的属性观察与状态回调方式。此外,还对性能进行了优化,并修复了安全性和细节问题,同时带来了一些 Breaking Changes。

考虑到这个版本在多年后带来的众多改进和优化,我们强烈推荐已经使用 IGListKit 的团队关注并尝试更新,以期获得更出色的性能、稳定性和新功能。

🐎 SwiftSecurity: Modern Swift framework for Keychain API

@含笑饮砒霜:SwiftSecurity 是 Apple 安全框架的现代 Swift API (Keychain API、SharedWebCredentials API 等)。通过编译时检查,以更简单的方式保护您的应用程序管理的数据。SwiftSecurity 与其他包装器有些不同,它支持每个钥匙串项目类别,与 CryptoKit 和 SwiftUI 兼容等。

音视频

🐢 The Sound of Software

@CrazyCoderShi: 顾名思义,本系列文章讲述如何在软件中使用声音,从声音的本质开始阐述,到工具推荐,到整体设计,一连串文章一步步带你创造酷炫的声响;该系列由 notboring 产出;notboring 崇尚酷炫的交互和极致的影音体验 , 他们在 App Store 上有诸多酷炫的应用 , 有声音软件开发的同学 , 强烈推荐学习 !

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #288 | 2024-05-13

13 May 02:29
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

AppStore Connect 提交失败 Workaround

上周陆续有读者在老司机的 App Review 群中反馈提交审核时遇到了奇怪的问题,也有群友提供了解决方案,我们再次汇总如下:

  1. 当遇到 2.0.0 二进制文件无效 的问题,可以等待一会,换一个小版本号重新上传,可以解决。
  2. 当遇到 无法添加以供审核 的问题,需要在 ICP 备案的输入框中在正常输入备案号后,再额外增加一个空格。即可进行后续流程。


新手推荐

🌟 戴铭的 Swift 小册子

@AidenRao: 小册子是一个使用 Swift、按照声明式 UI 和响应式编程范式开发的开源 macOS 程序,上面的内容主要面向 Swift 零基础的同学,包括 Swift 的知识点、直接可用的小例子和知识点相关的其它资料,推荐 Swift 新手及感兴趣的同学学习使用。

Safely unwrap optional values in SwiftUI bindings

@zoeGuo:在 SwiftUI 中 , $ 符号用于创建一个绑定到可观察对象的引用。但一个可选对象用 $ 后得到的是一个不可选的对象。那么在这种场景下可以使用 Binding 将对象包装,Binding 的初始化方法 init?(_ base: Binding<Value?>) 会解包绑定的可选值,并提供一个非可选值,这样就又可以对原来的可选值进行安全解包了。文章中有简洁明了的代码示例,感兴趣的读者可以阅读原文。

文章

🐎 iOS 依赖库版本一致性检测:确保应用兼容性

@BluesJiang:本篇主要介绍了一种检测系统库最低版本依赖的方法。核心的思路使用 otool 获取依赖的系统库,然后调用苹果的接口来查询系统库支持的最低系统版本。用来解决 App 意外错误引入高于 App 最低支持系统版本的系统库,导致 App 启动崩溃的问题。

🐎 淘系两年半 A/B 实验经历,聊聊我理解的“科学实验”

@Smallfly:这篇文章主要讲述了作者在淘系两年半的 A/B 实验经历,包括在货架电商和内容电商两个领域的 A/B 实验能力建设。文章中,作者分享了对科学实验的理解和实践,文章中提到了几个关键点:

  1. 业务目标科学:增长目标应该是长期健康、可量化验证的。
  2. 实验设计科学:在常规实验中,样本组的同质性和样本间的独立性是重要的考虑因素。
  3. 实验数据可用:强调了 AA 检验的重要性,以确保实验数据的可用性。
  4. 实验分析科学:在获得可用的数据基础上,关注实验分析的问题,包括确定需要观察的指标和维度,以及如何处理低响应实验。

🐎 彻底弄懂 Linux 下的文件描述符(fd)

@DylanYang:本文介绍了 Linux 下的文件描述符(file descriptor)。文件描述符是内核对已经被打开文件所创建的索引。内核维护了一张进程级别的文件描述符表,记录了每个文件描述符对应的文件指针,使得对这些文件进行 I/O 操作的系统调用都可以通过文件描述符来实现。同时系统还维护着系统级别的打开文件表和 i-node 表,这两张表内有关于打开文件更多的信息,包括偏移量、访问模式、权限等。文件描述符表指向打开文件表,打开文件表则又指向了 i-node 表。此外,本文也举例了通过 shell、C 语言、python 等方式打开文件后,文件描述符的实际表现。

🐎 OS Style settings view

@水水:如果您正苦恼于不知道怎么给 MacOS 应用添加一个符合 MacOS 风格的设置页面,那么本文给出了简单的代码示例教您如何去实现,敢兴趣的读者可以参考 ~

🐎 Flutter 之 HTTP3/QUIC 和 Cronet 你了解过吗?

@极速男孩:本文介绍了 HTTP/3 和 QUIC 协议及其在 Flutter 中的应用,特别是通过 Cronet 库。HTTP/3 基于 QUIC 实现,优化了网络连接的稳定性和效率,支持连接迁移和加密。Cronet 作为 Chromium 的网络堆栈,支持 QUIC 和 TCP,可通过 Flutter 使用,增强移动应用的网络性能。文章还讨论了如何在 Flutter 项目中通过 cronet_http 包和 Dio 库集成 Cronet,利用其在 Android 上的优势,以及 iOS 上用 NativeAdapter 的来支持 HTTP/3。

播客

🐢 SWIFT PACKAGE INDEXING EPISODE 43: Now I ’ m worried our metrics aren ’ t correct! with special guest Holly Borla

@Kyle-Ye: 本期 SwiftPackageIndex 播客和特邀嘉宾苹果的 Swift 语言团队的负责人 Holly Borla 讨论了 Swift 6 的并发特性和语言模式迁移,Swift Package Index 中的 Swift 6 兼容性跟踪项目。同时介绍了一些与并发相关的提案(SE414 和 SE431)和 Swift 软件包。

工具

difftastic

@Crazy:difftastic 是一款专门针对文件对比的工具,这个工具不是简单的逐行对比,会根据语言以及运行环境进行分析,提供更便于阅读对比界面。该工具现在支持多种语言,移动端开发所用的 Swift、Java、Kotlin、Dart 都已经支持。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #287 | 2024-04-29

29 Apr 02:54
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

文章

🐕 RxSwift 6 更新了什么

@zoeGuo:这是一篇 What's new in RxSwift 6 ?
的译文,文章介绍了 RxSwift 6 的新特性和重要更新,如将 Binder 从 RxCocoa 迁移到 RxSwift、使用 @dynamicMemberLookup 自动建立 Binders、新的 withUnretained 运算符,以及一些运算符重命名
等。无论你是 RxSwift 的新手还是老手,这篇文章都能提供给你大量有价值的信息,帮助你更好地利用 RxSwift 提升开发效率。

🐕 SwiftUI: Custom View Transition(Navigation) With Matched Geometry

@Damien:文章主要讨论了如何在 SwiftUI 中使用 matchedGeometryEffect 来自定义视图转换。例如,如何动画化文本的位置,如何以不同的方式动画化多个视图,如何创建一个放大效果等等动画。文章还详细介绍了如何在视图上使用 matchedGeometryEffect 来替换当前的 NavigationStack,这篇文章为那些希望在 SwiftUI 中自定义视图转换的开发者提供了一种新的可能性。

🐕 Swift 6 upgrade Preparation

@Kyle-Ye: 文章介绍了如何在 Xcode Project 项目和 Swift Package Manager 项目中如何逐步采用 Swift 6 模式的部分功能,以便为即将到来的 Swift 6 做好准备。除此之外,本文也介绍并讨论了如何处理一些常见的迁移问题,如 Actor 相关的各种报错。

完整的 Swift Features 清单可以通过以下 Gist 中提供的脚本获取:

工具

🐎 Periphery

@Smallfly:Periphery 一款专门用于识别 Swift 项目中未使用代码的工具。通过分析项目的源代码,帮助开发者发现并删除那些在项目中没有被引用的代码部分,从而精简代码库,提高代码的可维护性。

🐕 Copilot For Xcode

@Cooper Chen:Copilot for Xcode 是一个 Xcode 源代码编辑器扩展,为 Xcode 提供 GitHub Copilot、Codeium 和 ChatGPT 支持,包括以下功能:

  • 代码建议(由 GitHub Copilot 和 Codeium 提供支持)。
  • 聊天(由 OpenAI ChatGPT 提供支持)。
  • 提示代码(由 OpenAI ChatGPT 提供支持)。
  • 自定义命令将聊天和提示扩展为代码。
    建议开发者都可以尝试使用这个拓展工具,能够大大提高工作效率。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

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

22 Apr 02:11
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新手推荐

🐕 Xcode Bookmarks

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

文章

🐎 How to define a custom file header for a Swift Package

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

🐕 Actor reentrancy in Swift explained

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

🐎 Splitting Up a Monolith: From 1 to 25 Swift Packages

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

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

🐕 Fetching OSLog Messages in Swift

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

🐎 Bar Chart creation using Swift Charts

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

🐕 QQ 9 “傻快傻快”背后的技术秘密

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

工具

🐎 Mac App 原生内置 Debug 菜单

@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 及往年内参

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #285 | 2024-04-15

15 Apr 02:20
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

iOS 17.4/17.4.1 新安装的用户首次启动 IDFA 权限获取失败,以及 workaround

首次新安装 APP 的用户会在通过 ATTrackingManager.requestTrackingAuthorization() 申请 IDFA 的时候自动失败(即使用户还没有手动点击拒绝),这会对依赖 IDFA 归因或者正在投放的 APP 造成一定影响,论坛也已经有同学给出 workaround(通过 IDFA 弹窗在关闭时会触发 UIApplication.didBecomeActiveNotification 进行再次判断)。

文章

🌟 🐕 五年沉淀,微信全平台终端数据库 WCDB 迎来重大升级!

@JonyFang:在接口层面,新版 WCDB 全面支持了 C++、Java、Kotlin、Swift 和 ObjC 这五种主要的终端开发语言,覆盖了 Android、iOS、Windows 、macOS 和 Linux 这五大终端平台。同时,还对 Winq 进行了重写和强化,使开发者能够在各种语言中使用原生语法编写任意 SQL。

在功能层面,新版 WCDB 推出了全新的数据备份和修复方案,大幅提升了数据修复率,同时将数据备份的性能消耗降至可忽略不计。此外,还重点推出了数据迁移和数据压缩这两个新功能,让开发者仅通过简单的配置,就能高效处理复杂业务中的数据过度聚集和数据过度膨胀这两大难题。新版 WCDB 还推出了 FTS5 优化和可中断事务等新特性,使开发者在特定场景下可以实现更极致的性能优化。

🐕 How to avoid using AnyView in SwiftUI

@AidenRao:这篇文章讨论了在 SwiftUI 中避免使用 AnyView 的方法。AnyView 是一种类型擦除视图,用于包装其他 SwiftUI 视图,但它会降低 SwiftUI 的性能。文章提出了三种替代方案:

  1. 使用 @ViewBuilder 属性:通过在属性或函数上添加 @ViewBuilder 属性,可以将多个视图组合成单个返回类型,而无需使用 AnyView。
  2. 使用 Group 类型:Group 类型允许将多个视图组合成一个视图,而不会影响布局。使用 Group 可以避免使用 AnyView,并可以根据需要组合不同类型的视图。
  3. 使用泛型:当需要存储不确定类型的视图时,可以使用泛型来代替 AnyView。通过使用泛型参数,可以灵活地存储和使用视图,而无需使用 AnyView。

🐕 In Search of a Smooth Scroll

@水水:本文记录了作者由于对更平滑滚动的追求而将 LazyVGrid 替换为 NSTableView 的过程,可以见到结果是 NSTableView 确实会有更丝滑的效果,不过作者并不是希望大家认为 SwiftUI 很慢而 AppKit 很快,或者 macOS 上的 SwiftUI 还没有为重要的应用程序做好准备,事实上作者重写过程中 SwiftUI 已经解决了部分问题。最后作者聊了对 AppKit 的非官方见解和反思,也希望大家对两种技术都有着同样的热爱。

🐎 Exploring ABI stability, @frozen, and library evolution mode

@DylanYang:本文作者通过 @frozen 关键字,引申出 Swift 的 ABI 稳定和 library evolution mode。其中 @frozen 关键字确保了 enumsstructs 的接口不再改变,因此也保证了内存布局的固定,带来了更好的性能。ABI 稳定则使得面得不同的语言版本,swift 库不再需要每次重新编译就可以兼容高版本。而 library evolution mode 是一个编译器能力,开启它后使得编译器会产出额外的用于描述关于库的数据结构、方法等的元数据,确保在不同的语言版本下,这些数据依然保持一致。这三者共同确保了 Swift 库在不同语言版本、不同操作系统版本下的兼容性,并最终带来了更好的的开发体验。

工具

🐕 Mac OS X Debugging Magic

@Cooper Chen:在 MacOS 开发中,Apple 提供了许多调试工具,以协助开发者针对特定场景进行开发和调试。这些工具中的许多被保留在发布的系统中,供开发者使用以调试其代码。下面列举了一些在 Mac OS X 中的“秘密”调试工具,包括环境变量、首选项、可从 GDB 调用的例程以及特殊文件等。若你正致力于 Mac OS X 软件开发,这个调试工具集合列表将极具帮助。

代码

🐕 COW Macro Package

@Kyle-Ye:Swift 的大量标准库内的 struct 出于性能等因素考虑都进行了 Copy On Write(后简称 COW)优化(如 String、Array、Set、Dictionary),但是对于业务自定义的 struct 默认没有此类优化。

因此如果业务定义了一个巨大的 struct,在此 struct 作为参数传递过程中,容易产生较大的包大小并且有一定性能影响。

对于每个希望开启 COW 的 struct 进行手写优化较为繁琐,下面是本期推荐的两个相关 COW Macro 的开源库,可以帮助我们快速 opt-in 此项优化。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #284 | 2024-04-08

08 Apr 02:07
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

文章

🐎 Generate and read analytics reports from the App Store Connect API

@Smallfly:这篇文章介绍了苹果公司最近推出的 50 多种新的分析报告,这些报告包括应用商店参与度、应用商店商务、应用使用情况、框架使用情况和性能等方面的数据。虽然这些新数据提供了很多洞察力,非常有价值,但它们仅通过 App Store Connect API 独家提供,而且获取数据的方式并不直观。文章中介绍了如何使用 App Store Connect Swift SDK 来访问这些新的指标。如果对该方式感兴趣,值得一读。

🐕 Swift Isolation Intuition

@DylanYang:本文详细介绍了 swift 并发框架中的隔离(Isolation)概念,作者通过一系列的例子阐述了如何判断当前代码上下文的隔离状态。关于隔离,作者总结了三条规律:

  1. 隔离状态是在方法、数据结构、变量等声明时就确定的
  2. 隔离状态只会被 async 改变
  3. Protocal 也可以声明隔离状态

同时应当牢记隔离状态是一个编译时的声明,运行时的状态并不重要,即使一段代码在运行时只会跑在主线程上也不代表它是一段主线程隔离(MainActor-isolated)的代码。

本文在书写过程中假设读者已经对 swift 并发的基础概念((Actor、Task 等))有了一些了解,建议未接触过 swift 并发的读者可以简单了解下这几个概念后再阅读此文。

🐢 Near real-time UI code generation on iPad

@BluesJiang: 本论文展示了如何利用 YOLO 模型实现从草图到 SwiftUI 代码的流程。详细说明了从数据收集处理、模型训练以及利用 CoreML 实现单机完成部署投放。这里利用 iPad 强大的绘画、机器学习、SwiftPlayground 的能力,可以充分的展示这种可能性。具体展示的效果可以查看 Demo 视频。这篇论文很好的展示了机器学习实践的完整流程,值得学习。

理解 C++ 的六种 Memory Order

@老驴:本文详细介绍了 C++11 中引入的六种内存顺序(memory order)的概念,目的是解决多线程环境下的数据一致性和可见性问题。内存顺序包括:

Relaxed:不保证顺序性的最宽松内存顺序。
Consume:保证读操作能看到数据依赖的写操作。
Acquire:确保读操作可以看到在相应 release 操作之前的所有写操作。
Release:确保写操作之前的所有操作对其他线程可见。
Acquire-Release:同时包含 acquire 和 release 语义。
Sequential Consistent:所有线程看到一致顺序操作的最严格内存顺序。

想要了解 C++ 内存的话,值得一读。

🐕 Using @_silgen_name to forward declare functions in Swift and improve build times

@Cooper Chen:文章介绍了使用 @_silgen_name 属性在 Swift 中前向声明函数以及改善构建时间的方法。作者强调了谨慎使用这一技巧的重要性,并解释了其工作原理和潜在风险。通过示例和技术细节,文章展示了如何使用该属性来提高 Swift 应用程序的构建效率,尽管牺牲了一些类型安全性。最后,作者呼吁 Swift 支持更多类似的功能,以满足开发者对更多控制和灵活性的需求。这对于需要提升 Swfift 编译速度相关内容的开发者有一定的参考价值。

🐕 lldb remove randomness

@极速男孩:这篇文章介绍了如何使用 LLDB 调试器去除调试第三方应用时的随机性。通过一个示例程序,演示了生成随机数据并打印出来的过程。文章重点在于展示如何通过设置 LLDB 断点和特定命令,强制 randomData 函数返回固定长度和内容的数据,从而消除随机性。作者分步骤说明了如何先返回固定大小的数据,然后是动态大小但固定数据,最终是动态大小且看似随机但实际一致的数据。这一技巧在需要调试包含随机元素的程序时非常有用,能够提高调试的效率和准确性。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

老司机 iOS 周报 #283 | 2024-04-01

01 Apr 02:13
Compare
Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

周报编辑组又来新人啦~

欢迎 DylanYang 加入老司机技术,目前就职于字节跳动,参与音乐相关客户端开发,业余喜欢看看番、打打游戏。

欢迎 Kyle-Ye 加入老司机技术,他是 Swift Documentation Workgroup 成员,独立开发者,专注于 OpenSwiftUI / Swift 相关研究。

希望 DylanYang 与 Kyle-Ye 的加入也能为大家带来更多元化的内容输出!

文章

🐎 A better pull request

@Smallfly:在使用 Git 时,执行 git diff master...alice/master,「三个点」查看当前分支与远端分支的差异,清楚的了解将要拉取的内容,然而当远端分支有提交时,新的提交无法在 diff 中显示,这么设计有其合理性。本文作者认为不太方便,在 Bitbucket 中使用「两个点」展示与最新分支的 diff 会更清晰。对实现感兴趣的同学可阅读原文了解。

🐎 SwiftUI Previews-based architecture

@DylanYang:本文作者通过一个简单的 demo 阐述了如何实现基于 SwiftUI Previews 框架的开发流程。同时作者也借此引入了他认为实现代码灵活性和解耦的两个工具:接口(Interface)和依赖注入(Dependency Injection),并在 demo 中进行了实践。接口在 Swift 中以原生的 Protocol 呈现而依赖注入则可以凭借 SwiftUI 中的环境变量(Environment Values)来实现。此外借助 @ObservableObservableObject 和环境变量等能力,整个框架在渲染性能、内存和数据同步方面都非常优秀。

🐕 Using a Swift macro to generate an EnvironmentKey

@Barney:这篇文章介绍了如何使用名为 @EnvironmentStorage 的 Swift 宏来简化 SwiftUI 中 Environment 的使用,自动生成 EnvironmentKey 和相关的 EnvironmentValues 代码,减少样板代码,提高开发效率。通过引入 SwiftUIMacros 包并应用该宏,开发者只需定义属性名、类型和默认值即可快速创建环境存储,从而节省时间并减少错误。

🐕 Be Careful When You Initialize a State Object

@AidenRao:在这篇文章中,Jared Sinclair 谈到了在使用 @StateObject 时需要注意的一些最佳实践:如果你必须显式地初始化 @StateObject,请密切注意属性包装器的初始化参数是一个名为 thunk 的转义闭包,而不是一个名为 wrappedValue 的对象。请在闭包内部完成所有封装对象的初始化和预处理,否则就会损害性能优势,而性能优势很可能正是你使用 @StateObject 的初衷。

🐕 Unrestricted View Replication

@JonyFang: 本文讨论了在 iOS 应用中单 UIView 实例多副本场景的处理。首先介绍了使用私有 API _UIPortalView 来实现复制视图的方法,但指出这不符合苹果的规定,因此需要寻找其他解决方案。

接下来,引出 CAReplicatorLayer 来实现复制视图的方法。CAReplicatorLayer 可以创建多个视图的副本,并对每个副本应用递归变换。文中也讨论了使用嵌套的 CAReplicatorLayer 来创建复杂布局的方法,但指出这种方法会导致视图复制的复杂性和性能问题。
最后,提到了 CAReplicatorLayerinstanceDelay 属性,该属性可以在复制的视图实例之间创建动画延迟。

🐎 How to run asynchronous code in Swift Playground correctly?

@zoeGuo:Swift Playground 是快速试验 Swift 代码的绝佳工具。默认情况下,Swift Playground 从程序的顶部到底部同步执行代码。当运行异步代码时,会遇到代码执行不会结束的问题。引入 PlaygroundSupport 库,配合使用 needsIndefiniteExecutionfinishExecution() 两个 API,即可在 Swift Playground 中编写异步代码并顺利执行,文中例举了在 Swift Playground 中使用 dispatchGroup 完成异步逻辑的操作。

🐎 Make Your iOS App Smaller with Dynamic Frameworks

@Leo:iOS 的 Widget 和 ShareExtension 是独立的 target,sandbox 和主 App 是独立的,如果多个独立的 Target 采用静态链接的方式来构建,那么某些基础库的的代码和资源会被在多个 Target 之间拷贝多份。本文提出了一种解决多 Target 之间共享代码和资源的方式,即用 Dynamic Framework,可以显著优化包大小。

内推

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

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

关注我们

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

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

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

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)