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

## 新手推荐

### 🌟 [Flutter-Notebook](https://github.com/OpenFlutter/Flutter-Notebook/blob/master/README.md)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：Flutter-Notebook 由 OpenFlutter 小组产出，包含了很多常规移动端开发的组件/效果实现, 在目录的最后还附上了一本 [Flutter in Action](https://github.com/flutterchina/flutter-in-action), 着实为一份 Flutter 入门学习不可多得的资料:

- 官方控件效果实现
  - 视图
  - 功能
  - 动画
- 优秀三方库
- 状态管理
- 其他

## 文章

### 🐕 [What’s New in Natural Language APIs in iOS 13](https://www.appcoda.com/natural-language-apis-ios-13/)

[@AidenRao](https://weibo.com/AidenRao)：去年，Apple 推出了 [NaturalLanguage](https://www.appcoda.com/natural-language-processing-swift/) 框架，用于分析自然语言文本并推导其特定于语言的元数据。你可以将此框架与 Create ML 配合使用来训练和部署自定义 NLP 模型。

iOS 13 上此框架更新了新功能
- 内置情感分析，对文本进行 -1.0 到 1.0 的打分，确定一组文本是积极还是负面。
- 单词标记，单词应用标记系统，可用于模糊搜索，相似物品推荐系统。
- 自定义单词嵌入，用于自定义单词标记模型，控制推荐算法。
- 文本目录，用于将同类型词汇按组标记，建立简单的单词标记模型。

### 🐕 [Generalizing Swift code](https://www.swiftbysundell.com/posts/generalizing-swift-code)

[@张嘉夫](https://github.com/josephchang10)：判断某一块代码是否需要重构往往是件很棘手的事。虽然采用可复用的函数或类型可以大大减少代码冗余，但过于抽象的代码会导致难以阅读和维护。在这篇文章里，作者通过几个关键因素来帮助我们最大程度地重用代码，同时又能够避免让代码过于复杂或难以理解，从而取得良好的平衡。

### 🚧 🐕 [Flutter: the good, the bad and the ugly](https://medium.com/asos-techblog/flutter-vs-react-native-for-ios-android-app-development-c41b4e038db9)

[@looping](https://github.com/looping)：作者在用 Flutter 开发了一款应用后，总结了 Flutter 的一些特性和自己使用后的心得体会，整体感觉是 —— “Not bad” —— 还不错。本文虽然是大半年前写的，但还是可以当作技术选型的避坑指南来参考。
Flutter 的好处就不用多说了，列下作者比较在意的几个点：

- Flutter 社区还比较小众，贡献者不算多，最佳实践偏少，组件不够丰富，出错调试也比较费神（社区是在逐步扩大的，但选型时还得看团队能力和工作饱和度，能不能自己消化一些问题）。
- UI 层自己绘制，样式跟系统有脱离，在系统控件设计发生改变的时候，还得依赖社区升级相关组件（国内大部分应用界面的控件都是定制化的，即使原生开发也会面临这样的问题，不过 Flutter 会暴露的更加明显）。
- 跟原生混编以及平台差异化设计（某功能只在某端有，或者界面表现不一样等）会使整体结构变得复杂，在投入使用时就要考虑好后期的维护性（这个是跨平台框架的通病，要避免在过于复杂的业务场景上使用）。

### 🐎 [域名背后那些事](https://leancloudblog.com/Domain-Name-Story-confirm/)

[@莲叔](https://weibo.com/aaaron7)：很多没有建站经验的童鞋对于域名唯一的了解就是它作为 IP 别名的作用，其实域名背后的学问有很多。正确的了解域名解析的知识可以让我们在设计底层网络模块的时候更有信心，并实现更优雅的网络层解决方案，比如近期在移动端非常流行的 HTTPDNS 技术，就是从域名解析的原理出发，巧妙的解决了劫持问题。leancloud 这篇文章较为体系的介绍了域名的组成结构以及 DNS 服务器进行域名解析的基本流程，还扫盲了常见的域名记录类型以及作用，非常适合不熟悉域名的童鞋们阅读。

### 🐕 [CAEmitter​Layer](https://nshipster.com/caemitterlayer/)

[@J_Knight_](https://github.com/knightsj)：本文作者 Mattt 介绍了 CAEmitterLayer 的使用方法，并结合代码展示了如何使用 CAEmitterLayer 和 CAEmitterCell 来实现一个从上方自然落下的纸屑效果。在文章末尾，作者还给出了实现同一效果的7种不同的方案：

 - SpriteKit Particle System
 - SceneKit Particle System
 - UIKit Dynamics
 - HEVC Video with Alpha Channel
 - Animated PNGs
 - WebGL

对粒子发射器效果有兴趣的读者可以看一下这篇文章。

### 🌟 🚧 🐕 [Reducing Memory Footprint and OOM Terminations in iOS](https://medium.com/flawless-app-stories/techniques-to-reduce-memory-footprint-and-oom-terminations-in-ios-a0f6bef38217)

[@红纸](https://github.com/nianran)：当应用程序消耗太多内存，就会被系统杀掉。占用过多的内存空间会增大被查杀的概率。在本文中，作者介绍了多种图片处理技巧，让我们更好的减少内存的占用，总结如下：

1. 更换色彩空间 sRGB(8位) 代替 DisplayP3(16位)。
2. 利用 UIGraphicsRenderer 同时绘制同一矩阵内图像（🌰：聊天头像），使用 UIGraphicsRenderer 也可以复合图像，其只需要占用一帧大小即可。
3. UIGraphicsRenderer 会自动识别使用 DisplayP3，而 UIGraphicsBeginImageContextWithOptions 最多使用 sRGB。
4. 在瀑布流这种滚动展示图片列表中，可以使用计时器统计活动中的图片，为活动中的图片加载剩余的部分。
5. 使用更小的图片，很多图片服务商可以对图片进行预处理下发（参考：[七牛云图片预处理](https://developer.qiniu.com/dora/manual/1270/the-advanced-treatment-of-images-imagemogr2)）
6. 更好的管理缓存，在进入后台的时候都可以进行清理（例如，URL 缓存、已存入磁盘的图片内存缓存）。
7. 在出现内存警告，对于不可见的页面，可以进行清除操作。
8. 检查代码的内存泄露。
9. 不用清除基于 NSDictionary 的缓存，应使用 NSCache（[原因](https://developer.apple.com/videos/play/wwdc2018/416/)）。

### 🌟 🐎 [Managing background tasks with the new Task Scheduler in iOS 13](https://medium.com/snowdog-labs/managing-background-tasks-with-new-task-scheduler-in-ios-13-aaabdac0d95b)

[@zvving](https://github.com/zvving)：iOS 13 中苹果引入 `BackgroundTasks framework`，力求在提供流畅用户体验与延长电池使用时间之间找到平衡。本文可以快速了解后台任务的新变化：

- `Background fetch mode`：规则与之前一样是 30s 执行时间，介绍如何使用新框架的 BGAppRefreshTask 实现
- `Background processing mode`：新增的后台模式，可以持续几分钟高 CPU 占用运行（指定充电期间运行，可以避免因 CPU 占用过高被『杀死』）
- 如何调试后台任务

如果你希望了解更多，移步[全新后台任务框架及最佳实践](https://xiaozhuanlan.com/topic/1806594273)有更详细的介绍。

### 🐕 [Unused images and resources clean up in Xcode](https://www.avanderlee.com/optimization/unused-images-clean-up/)

[@老峰](https://github.com/GesanTung)：本文作者总结分享了以下三个清理项目无用资源文件，清理 Xcode 无用缓存文件的开源工具：

- [FengNiao](https://github.com/onevcat/FengNiao/blob/master/README.md)：作者是 @王巍(onevcat) , 是一款简单的命令行工具可删除项目无用的资源文件。
- [LSUnusedResources](https://github.com/tinymind/LSUnusedResources)：作者是 @tinymind，是一款图形界面的 Mac 应用也是用来删除项目无用的资源文件。
- [DevCleaner](https://github.com/vashpan/xcode-dev-cleaner)：作者 @vashpan ，是一款图形界面的 Mac 应用，可清理 Device Support、Archives、Derived Data下无用的缓存文件，磁盘紧张的同学可以试试。

> Tips：[FengNiao](https://github.com/onevcat/FengNiao/blob/master/README.md) 和 [LSUnusedResources](https://github.com/onevcat/FengNiao/blob/master/README.md)  实现原理相似，都是遍历资源目录下后缀 ["imageset", "jpg", "png"...] 的文件，然后在源文件 ["m", "swift", "xib", "storyboard"...] 中字符串匹配，无匹配则是无用的资源文件。

### 🐕 [Generate & Host your iOS Documentation](https://medium.com/@jonathan2457/generate-host-your-ios-documentation-39e21b382ce8)

[@kyo](https://github.com/KyoLi)：对于我们平时写的一些项目工程代码，常常需要写一些文档，否则不要说交接给别人，就是过几个月，如果没有文档，可能我们自己都不一定能完全理解。但是，随着工程的迭代，文档也常常需要更新，这需要我们花费很多时间在里面。而今天推荐的这款工具，可以帮我们自动的生成 iOS 文档，在文章中作者也简单示范了下，还是很容易上手的，推荐经常需要写文档的同学试一试。

### 🐕 [Formatter - NSHisper](https://nshipster.com/formatter/)

[@四娘](kemchenj.github.io)：将数据转化为人类可读的文本格式是一个重要且复杂的任务，需要根据用户的国家，语言，时区和货币等因素进行格式化，仅仅使用对象的 `description` 是远远不够的，实际工作中我会用到一个存在于 Foundation 核心部分的类型 —— `Formatter`。

本周 NSHisper 为我们介绍的就是 `Formatter` 这个重要的工具，文章里为我们列举介绍了 Apple 平台上 `DateFormatter` / `NumberFormatter` 等等各种不同的 `Formatter` 以及它们对应的用途，对于这些格式化工具不熟悉的同学都可以看一下。

## 工具

### 🌟 [免费又好用的 iOS UI 调试软件，Lookin 正式发布](https://mp.weixin.qq.com/s/FlGfb02ZOv9YLwCfEwIsjA)

[@Parsifal](https://weibo.com/parsifalchang)：Lookin 是微信读书团队出品的一款免费的 UI 调试工具，功能像 Xcode 自带的 UI Inspector 或者简版的 Reveal。除支持查看 UI 层级和视图信息外，还提供了方法监听功能，算比较实用的一个特性。目前虽然不能与强大的 Reveal 比较，但作为一款免费的功能软件，还是也比较推荐有相关需求的同学使用。


## 代码

### [DiffableDataSources](https://ra1028.github.io/DiffableDataSources/)

[@享耳先森](https://github.com/iblacksun)：Apple 在 WWDC 2019 新增了 `UITableView/UICollectionViewDiffableDataSource`，不过新 API 仅限 iOS 13，如需支持之前系统的话就用不了了，`DiffableDataSources ` 基于 [DifferenceKit](https://github.com/ra1028/DifferenceKit) 实现，提供了与官方近似的 API。

### [M80TableViewComponent](https://github.com/xiangwangfeng/M80TableViewComponent)

[@anotheren](https://github.com/anotheren)：来自网易的 `UITableView` 的组件化解决方案，

- 不用再和 IndexPath 及数组越界打交道
- 权责分离，和冗长的 UITableView Adapter 说再见
- UITableViewCell 自动重用
- 数据驱动的构建方式
- 安全的模型视图映射关系
- 单向绑定
- 灵活组装
- 自动高度缓存和简单的高度预计算支持
- 支持 ListDiff

## 内推

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