# 老司机 iOS 周报 #60 | 2019-03-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) 提出。

## 新闻

### [3 月 27 日起上传 App Store 最低需须使用 iOS 12.1 SDK 编译](https://developer.apple.com/news/?id=03202019a)

Apple 发布公告：请注意，自2019年3月27日起，iPhone 或 iPad 的所有新 App 和 App 更新（包括通用 App）都需要使用 iOS 12.1 SDK 构建并支持 iPhone XS Max 或 12.9 英寸 iPad Pro（第 3 代）。还需要提供这些设备的屏幕截图。Apple Watch 的所有新 App 和 App 更新都需要使用 watchOS 5.1 SDK 构建，并支持 Apple Watch Series 4。

## 新手推荐

### 🐎 [Flutter 您需要知道的知识点](https://mp.weixin.qq.com/s/4tdqptBIf4VHrjWmHeUKjA)

最近整理周报的时候发现关于 Flutter 的文章一下子多了起来，看来最近研究 Flutter 的人应该有不少，不过我觉得对于大部分读者来说，目前对于 Flutter 还是处于一个萌新的状态，所以为了能看懂一些先行者到底在讲什么，这周给大家推荐两篇比较基础的文章：

- [Flutter 您需要知道的知识点 | FAQ・第一期](https://mp.weixin.qq.com/s/4tdqptBIf4VHrjWmHeUKjA)

这篇文章主要讲了 Flutter 是什么，能做什么，什么样的人适合使用 Flutter 以及 Flutter 需要怎么样入门以及如何使用。

- [Flutter 您需要知道的知识点 | FAQ・第二期](https://mp.weixin.qq.com/s/0JdDapzGIPByttq-key3Cg)

在看完上面一篇文章的基本介绍之后，就要了解一下 Flutter 里面的内容了，这篇文章大概介绍了关于 Flutter 的 SDK 主要功能，支持的编辑器，开发的灵感来源以及是否包含测试框架等一系列问题。

### 🐎 [UIApplicationDelegate 中方法的调用顺序](https://recoursive.com/2019/03/14/guide_uiapplicationdelegate_method_invocation_order/)

本文介绍了在 UIApplicationDelegate 中的各个方法在各个不同状态下启动和打开是所调用顺序。

## 文章

### 🐕 [即将开源 | 让 Flutter 真正支持 View 级别的混合开发](https://mp.weixin.qq.com/s/-vyU1JQzdGLUmLGHRImIvg)

本文介绍了今日头条主客户端上接入 Flutter 进行混合开发的经验，主要是解决如下问题
1. FlutterView 在一些小场景碎片化的问题。譬如短期内无法完成页面级别的 Flutter  化，Native View 和多个 Flutter View 必须混合存在的情况。类似的还有 Feed 流中的 Flutter Cell，列表页中的某些 ItemView 是 FlutterView。
2. 内存管理问题：回收不活跃页面占用的内存
3. 共享线程：收敛全局线程为公共的4个线程
4. SurfaceView 改 TextureView ：主要是解决手势动画的问题

总结来说，字节跳动客户端基础技术 Team 目前对于 Flutter 已经有了一定的研究，并且能够支持到 View 级别开发，目前文中提到的方案正在进行公司内部开源审查程序，通过后会在字节跳动官方 Github 上开源。

### 🐢 [如何构建具有多种 Cell 类型的表视图](https://github.com/xitu/gold-miner/blob/master/TODO1/ios-how-to-build-a-table-view-with-multiple-cell-types.md)

iOS 开发中，可以说几乎所有的项目都离不开 UITableView 的使用，甚至它的各种变形扩展都无处不在。UITableView 运用广泛的主要原因在于其 Cell 的多变性，在 Cell 数量和顺序恒定或展示内容相似的时候，这是比较常规的用法。但是当数量顺序甚至展示内容不尽相同的时候，这是比较有趣又极具挑战的。本文作者则指出传统写法在这种复杂情境中的弊端，并使用 MVVM 模式去构建这种动态试图：

1. 模仿服务器响应，创建简单 JSON 数据，将 JSON 映射到 Model
2. 基于 Model 创建 ViewModel，它将负责向 UITableView 提供数据，ViewModel 具有一个 Item 数组，它对应着 UITableView 包含的 Section 数组
3. 每种Cell 对应 ViewModel 中的 Item 属性，可修改或者删除数据而不需要做任何代码修改

这种模式最大的好处，就是在复杂业务情境下将业务和页面区分出来，免去各种分支判断及数据修改造成的大量代码修改，并且 ViewModel 也易被重用。

### 🐕 [UTF-8 String](https://swift.org/blog/utf8-string/)

文章内介绍了，`Swift 5` 将字符串的编码格式从 `UTF-16` 改成 `UTF-8`，以此提高性能。`Unicode-rich text` 和 `ASCII` 在 5 之前，用 `UTF-16` 存储，在这之后都用单个的 `UTF-8` 存储。

选用 `UTF-8` 的原因：
- 在 `ASCII` 中 `UTF-8` 比 `UTF16` 占用少50%。
- 高兼容性（对操作系统，开发工具，C / Objective-C 桥接）。
- 减少代码大小和编译时间成本。
- 无需修改现有代码。

更加详细的说明，请打开链接。

### 🐕 [Mastering the VIPER architecture](https://theswiftdev.com/2019/03/19/mastering-the-viper-architecture/)

作者介绍了面向协议编程在 VIPER 架构上的实践，并结合代码示例讲解了 Module,  Presenter 和  Entity 协议的定义和使用方法。

推荐阅读：
- [VIPER best practices for iOS developers](https://theswiftdev.com/2019/03/11/viper-best-practices-for-ios-developers/)
- [The ultimate VIPER architecture tutorial](https://theswiftdev.com/2018/03/12/the-ultimate-viper-architecture-tutorial/)

### 🐕 [Swift AVFoundation framework — Text-To-Speech tool](https://blog.usejournal.com/swift-avfoundation-framework-text-to-speech-tool-f3e3bfc7ecf7)

本文介绍了 AVFoundation 文字转语音的相关接口，并详细介绍了 `AVSpeechSynthesizer`, `AVSpeechUtterance`, `AVSpeechSynthesizerDelegate` 在实际应用中的流程与注意事项。

### 🐎 [Better tests for delegates](http://www.mokacoding.com/blog/better-tests-for-delegates/)

文中介绍了两种测试 `delegate` 调用的两种决策：面向实现、面向行为。在面向实现过程中，我们更多的关注状态变化，需要更多的测试 `delegate` 响应方法的实现。而在面向行为的决策中，我们不需要关注其参数细节，只需要关注其实现的内容。

## 工具

### [CocoaPods 历险 - 总览](https://www.desgard.com/cocoapods-1/)

是否应该使用 CocoaPods 在几年前还是一个争论不休的问题，然而现在，但凡稍具规模的项目，就没有不使用 CocoaPods 的。作为一个三方库版本管理的工具， CocoaPods 对于组件的拆分粒度是非常细微的，我们所调用的 pod 命令都是执行本地对应目录下的脚本，那这些脚本文件到底执行了什么呢？本文主要分析了 pod install 命令执行的详细过程，当我们知道大致过程后，就可以对其做一些修改和控制，以达到我们的预期。


## 代码

### [Snail: An observables framework for Swift](https://github.com/UrbanCompass/Snail)

一个轻量级的 observables 库，不用 KVO & RxSwift 也可以轻松观察变量的变化 & 响应事件了。

### [swift-log](https://github.com/apple/swift-log)

官方的日志接口包（Logging API package），使用方（比如 Swift 服务端、跨平台的应用或库）可以根据自己的需求配置 log 输出的具体实现。

## 音视频

### [ggtalk | 区块链到底能干嘛？](https://talk.swift.gg/22)
区块链近年来一个是技术圈的热点，风头甚至盖过了 AI，不少技术圈的名人也纷纷投身了区块链相关的创业中。本期 ggtalk 邀请到了微博上链圈名人赏味不足，来一起聊聊区块链的一些入门知识，强烈推荐感兴趣但一直没入门的同学收听。

## 内推

老司机周报团队联合知识小集和 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 。

## 本期编辑

[@四娘](https://kemchenj.github.io)，[@享耳先森](https://github.com/iblacksun)，[@Damonwong](https://github.com/Damonvvong)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@kyo](https://github.com/KyoLi)，[@tom510230](https://xiaozhuanlan.com/u/6682065345)，[@anotheren](https://anotheren.com)，[@水水](https://www.xuyanlan.com)，[@looping](https://github.com/looping)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)，[@邦ben](http://weibo.com/linwenbang)，[@红纸](https://github.com/nianran)，[@含笑饮砒霜](http://chinafish.news)，[@JimQ](https://github.com/waz0820)，[@老峰](https://github.com/GesanTung)，[@zvving](https://github.com/zvving)，[@J_Knight_](https://github.com/knightsj)，[@极速男孩](https://github.com/ztlyyznf001)

## 说明

🚧 表示需翻墙，🌟 表示编辑推荐

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


