# 老司机 iOS 周报 #114 | 2020-05-25

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


## 新手推荐

### 🐕 [CS193p Spring 2020 (Developing Applications for iOS using SwiftUI) 开始更新](https://cs193p.sites.stanford.edu/)

[@极速男孩](https://github.com/ztlyyznf001)：斯坦福大学的 CS193p 课程是针对 iOS 开发所推出的一个基础教程。在2020年春季的更新中，加入了在去年 WWDC 中推出的 SwiftUI 的内容。更多的内容可以看[这里](https://cs193p.sites.stanford.edu/about-cs193p) 。

## 文章

### 🐕 [一波 N 折的携程酒店 Swift-Objc 混编实践](https://mp.weixin.qq.com/s/N6ToEkN9c-2_rIvkv4o9hA)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：在 WWDC2019 大会上，随着 Swift5.0 发布之后，沉寂多年的 Swift 终于走上了快速发展的道路。iOS 开发语言的重心已经在悄悄倒向 Swift，本文即在讲述携程酒店在引入 Swift 混编带来的各种问题及解决方案，可供开发者们借鉴参考。

### 🐕 [The Future of Swift on the Server](https://www.timc.dev/posts/future-of-server-side-swift/)

[@莲叔](http://aaaron7.github.io/)：自从 IBM 在 Swift 上打了退堂鼓后，Server-side Swift 社区受到了不小的打击。大家纷纷猜测会不会这个命题已经不再成立。这篇文章带来了不少的好消息，甚至认为 2020 将会是 Server-side Swift 的利好年，其中最主要就是 Swift6 的 feature 中绝大多数都直接或间接的和 Server-side 有关或者利好。还有 Swift 的核心团队迎来了 Tom Doron 和 Saleem Abdulrasool, 一个是 SwiftNIO 的负责人，一个在尝试把 Swift 移植到 Windows，这些迹象都说明 Swift 的核心团队对于让 Swift 跳出 Apple 生态的决心。其他还有不少令人振奋人心的消息，具体建议大家直接看文章。

### 🐕 [Building a Design System for iOS](https://www.ramshandilya.com/blog/design-system-intro/)

[@张嘉夫](https://github.com/josephchang10)：为了便于设计师和工程师之间的沟通协作，作者为 iOS App 构建了一个设计系统，并在这个系列文章中介绍了他的经验，包括排版、颜色和动画等部分。设计系统能够定义产品的设计语言，包含可重用的组件，有明确的设计标准，可以将它们组合在一起来构建任意一款 app。采用设计系统的优势是可以提高设计的一致性、提高团队工作效率、方便辅助功能的开发，此外组件的可重用性还扩大了设计的应用范围。

### 🐕 [更方便、更强大: Flutter package 生态系统更新](https://mp.weixin.qq.com/s/y_lOfxlYlG6nM-4xduQ4Aw)

[@邦Ben](https://weibo.com/linwenbang/)：Flutter 这类新技术出现，最大的缺陷之一就是配套生态弱。近期，Google 为了提升 Flutter package 生态系统的可信度，增加了发布者认证和评分。根据各项指标评选出 270 个项目赋予 Favorite 徽章。这意味着，有 Favorite 徽章的三方库，你可以相对放心的使用。同时，Flutter 团队和英国的 Invertase 合作进行推进 Google Flutter 插件的优化（例如 firebase）。综上，这意味着 Flutter 生态会进一步得到改善，随着参与人数的日益增多，将会越来越好。

### 🐕 [Implementing design system components on iOS](https://medium.com/chili-labs/implementing-design-system-components-on-ios-6afe873ea586)

[@享耳先森](https://github.com/iblacksun)：Native View 如何进行组件化抽象并复用一直是个难题，作者通过一个实例介绍他的思路，并提供了 demo 项目。作者将可能复用的 View 抽取成 components，并提供对应的 ViewModel，同时，ViewModel 可以组合实现不同的 Protocol 完成诸如选中等事件分发。

### 🐕 [Fish-Lottie：纯 Dart 如何实现一个高性能动画框架？](https://mp.weixin.qq.com/s/4h6szVmDyiC5RjbLRC9ZZw)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：Lottie 是一个由 Airbnb 开源的横跨 Android，iOS，Web 等多端的一个动画方案，它以 JSON 的方式解决了开发者对复杂动画实现的开发成本问题。最近闲鱼开发团队在 Flutter 端实现了 Lottie - fish-lottie 。本文详细地介绍了 Lottie 架构以及 fish-lottie 实现思路👍。

### 🐎 [Verge — Start “store-pattern” state management before beginning Flux in UIKit iOS app development — preparation starting SwiftUI](https://medium.com/eureka-engineering/verge-start-store-pattern-state-management-before-beginning-flux-in-uikit-ios-app-development-6c74d4413829)
[@zvving](https://github.com/zvving)：本文是 Verge 上手指南：从一个数据驱动页面的小型业务场景出发，介绍如何引入 Verge 提供良好的业务代码隔离。

> [Verge](https://github.com/muukii/Verge) 是 Flux 架构的又一 iOS 实现，设计与 Vuex 基本一致，View 同时兼容 UIKit 及 SwiftUI，事件绑定支持 RxSwift 及 Combine。
更多内容请参考 [Verge-Docs](https://muukii-app.gitbook.io/verge/)

### 🐢 [震惊！生产力提效 300% 的秘诀全公开](https://juejin.im/post/5ec0d6b4f265da7b950569a9)

[@JimQ](https://github.com/waz0820)：工作要高效，方法很重要，这是一篇写给技术人的个人工作学习管理的方法论。如果你对精力管理、多层次的工作/学习计划、番茄工作法、定额工作法、批处理、多任务并行、图层工作法这些概念一知半解，快到碗里来吧。值得一提的是，本文不只讲方法其然，还讲其所以然，逻辑体例清晰，排版重点突出，配上作者本人真实场景的思维导图，是一篇深度好文，不是标题党。

### 🐢 [iOS Rendering 渲染全解析（长文干货）](https://juejin.im/post/5ec35cc55188256d92438174)

离屏渲染使用不当常常会导致屏幕卡顿，造成不好的用户体验，所以通常我们会尽量避免使用离屏渲染，例如减少圆角剪裁。但除了减少圆角剪裁，还有什么方式可以避免离屏渲染？以及离屏渲染使用过多为什么会造成卡顿？本文从计算机的渲染原理开始介绍，分析了屏幕成像和卡顿，然后讲到 iOS 中的渲染框架，最后引入离屏渲染这一问题，非常系统地让我们 iOS 的渲染原理有个比较深入的认知。

### 🐕 [大话 Socket](https://mp.weixin.qq.com/s/sVbWrWaq5P0kHxNhMVqzWA)

[@水水](https://www.xuyanlan.com)：要了解Socket首先要了解 TCP，而 Socket 是抽象出来的使用 TCP/UDP 的概念模型，屏蔽掉了晦涩的底层协议的实现，是一个接口。文本以图文趣味的方式带读者了解 TCP 的三次握手和四次挥手。相信你读完会让你对 TCP 有更好的理解。

## 工具

### [Introducing Piranha: An Open Source Tool to Automatically Delete Stale Code](https://eng.uber.com/piranha/)

[@xiaofei86](https://weibo.com/xuyafei86)：最近，Uber 开源了可自动删除无用代码的工具 Piranha。Uber 使用特性标记（Feature Flags）来做 A/B Test 和灰度发布，当这些功能完成测试或发布后就产生大量的无用代码，从而为项目带来技术债务。Piranha 通过扫描源代码来删除无用功能标志相关的代码，从而使代码库更干净，更安全，性能更高且更易于维护。Uber 已经在 Android 和 iOS 中使用 Piranha，并已使用它删除了大约两千个过时的功能标记及相关代码。感兴趣的读者可以阅读原文了解 Piranha 的实现，遇到的困难，以及在 Uber 自动化流程中的应用。

## 代码

### [Nuke 9](https://kean.github.io/post/nuke-9)

[@老峰](https://github.com/gesantung)：Nuke 9 是一个 Swift 版的图片加载库，Github 拥有近 5k Star，它有详细的文档，简洁的 API，支持更多的图片格式，使用全新的图片处理图形解码协议，支持图片预加载，更重要的是有高效的性能，比较遗憾的是目前仅支持 iOS 11+。

### [SwiftCoroutine](https://github.com/belozierov/SwiftCoroutine)

[@四娘](https://kemchenj.github.io)：一个 Swift 协程的第三方库实现，提供了 Future 和 Channel 等功能：

```swift
// 在主线程执行协程
DispatchQueue.main.startCoroutine {
    
    // 返回 CoFuture<(data: Data, response: URLResponse)>
    let dataFuture = URLSession.shared.dataTaskFuture(for: imageURL)
    
    // 挂起协程 await CoFuture 的结果，并且不会阻塞线程
    let data: Data = try dataFuture.await().data

    // 把 data 转成 UIImage
    guard let image = UIImage(data: data) else { return }
    
    // 在 global queue 执行耗时任务，在不阻塞线程的同时 await 结果
    let thumbnail: UIImage = try DispatchQueue.global().await { image.makeThumbnail() }

    // 在主线程将 image 设置给 UIImageView
    self.imageView.image = thumbnail
}
```

## 音视频

### [macOS 10.15: Slow by Design](https://sigpipe.macromates.com/2020/macos-catalina-slow-by-design/)

[@老驴](https://www.weibo.com/6090610445)：在379 期的 ATP 中讨论了他们在升级了 macOS 10.15 之后明显感觉系统变慢。本文的作者就根据这个去排查问题的根源，找出解决方案，并记录下其中的每一步。

不知道有多少人感知到了这个问题的存在，如果你对系统底层感兴趣的话，不妨来看看这些作者们是怎么一步一步发现问题根源并解决问题的。

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（OldDriverWeekly）会推送消息，欢迎关注。

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