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

## 新闻

### [『基于多重替换方式的 iOS 代码混淆方案』- 勘误](https://www.v2ex.com/t/557888#reply88)

在 65 期，我们收录了『基于多重替换方式的 iOS 代码混淆方案』一文，后经读者反馈，我们发现这篇文章的内容存在严重的抄袭迹象。文中涉及到的混淆方案抄袭自 [@kaich](https://github.com/kaich) 的 [codeobscure](https://github.com/kaich/codeobscure)。目前该文章的在知乎和掘金上已经被删除，周报也在第一时间删掉了有争议的推荐内容。对此次事件，我们对 [@kaich](https://github.com/kaich) 和广大读者表示抱歉，同时也感谢各位读者的监督和反馈。

另外，在收到反馈之后，我们小挖了一下那篇抄袭文的作者，发现此人是惯犯，洗稿专业户。他的 GitHub（[RobinChao](https://github.com/RobinChao)）和博客（[Technical.io](https://robinchao.github.io/)），真的是仿品聚集地。


### [WWDC 2019 for developers: Siri, Marzipan and AR improvements, more](https://9to5mac.com/2019/04/22/wwdc-developers-siri-marzipan/)

距离今年的 WWDC 已经只有将近一个月的时间了，众所周知，WWDC 向来能带给行业和开发者带来全新的围绕用户体验新技术，本篇文章给我们介绍了本次 WWDC 会发布的新的 API 以及特性，主要有：

1. 新的 Siri intents
2. Marzipan 的优化（Marzipan 就是让 macOS App 也能用上 UIKit 的技术）
3. Swift-only 的 AR 框架
4. 震动引擎，NFC 在以前的基础上提供了更多的功能
5. CoreML 支持动态训练以及音频的分析


## 新手推荐

### [How to make Auto Layout more convenient in iOS](https://medium.com/flawless-app-stories/how-to-make-auto-layout-more-convenient-in-ios-df3b42fed37f)

[@邦Ben](https://weibo.com/linwenbang)：该文从 Frame 布局，到 Autoresizing 讲到了 AutoLayout，并且介绍了如何简单的进行封装 AutoLayout，以提高易用性。毕竟众所周知，原生的 AutoLayout 异常难用，在 OC 下，Masonry 的出现简直是拯救了世界。在 Swift 下，各种布局系统百花齐放。同时眼光不妨放到 React Native 和 Flutter 上，声明式布局非常值得学习。

## 文章

### 🐕 [RxSwift & MVVM - How to use RxTests to test your ViewModel](https://benoitpasquier.com/how-to-use-rxtests-to-test-mvvm/)

[@Damonwong](https://github.com/Damonvvong)：之前我问过好多人这样一个问题，你觉得 Rx 框架到底解决了一个什么样的问题？虽然答案都不太一样，但是引入 Rx 框架，便于封装 ViewModel，然后编写单元测试提高应用稳定性是大部分人比较认可的一点。

所以推荐大家阅读一下作者写了三篇关于 RxSwift & MVVM 的文章：

- 第一篇是 [How to integrate RxSwift in your MVVM architecture](https://benoitpasquier.com/integrate-rxswift-in-mvvm/)：主要介绍了如何使用 RxSwift 编写 MVVM 结构的代码
- 第二篇是 [RxSwift & MVVM - An alternative structure for your ViewModel](https://benoitpasquier.com/rxswift-mvvm-alternative-structure-for-viewmodel/)：主要描述了一个 ViewModel 最基本的结构要怎么设计，我个人特别喜欢他在文中描述的 Intput 和 Output 的设计。这个设计也是为做单元测试做了一个很好的铺垫。
- 最后一是 [RxSwift & MVVM - How to use RxTests to test your ViewModel](https://benoitpasquier.com/how-to-use-rxtests-to-test-mvvm/)：讲的是如何利用前面的 VM 设计 结合 RxTest 编写单元测试。

### 🐎 [Conditional Compilation Part 1](https://davedelong.com/blog/2018/07/25/conditional-compilation-in-swift-part-1/) [Part 2](https://davedelong.com/blog/2018/07/25/conditional-compilation-in-swift-part-2/) [Part 3](https://davedelong.com/blog/2019/04/09/conditional-compilation-part-3/)

[@四娘](kemchenj.github.io)：之前我们在 [29 期周报](https://github.com/SwiftOldDriver/iOS-Weekly/blob/59bfdf3859a67d5667319000e4ee70f8f9cd6f76/Reports/%2329-2018.07.30.md#-conditional-compilation-in-swift-part-1)里介绍过这篇文章的第一篇：

> 本文讲述了 Swift 中方的条件编译。当然首先是传统的方法 arch()，作者对各个参数都做了详细的介绍。不过随着 Swift 4.1 的到来，你更应该了解一下方便好用的 targetEnvironment()(SE-0190)。其次是使用配置文件（.xcconfig），这个方式其实被 CocoaPods 大量使用。作者也用示例做出了详细的介绍，同学们不妨也在自己的工程中试一试。

后面陆续写了 Part 2 和 Part 3，主要是介绍了跨平台代码库编译选项的一些控制方式，对这方面有疑虑的同学可以看一看

### 🐕 [Flutter 实时视频渲染](https://zhuanlan.zhihu.com/p/62821195)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：Flutter 如火如荼的火了一段时间了，但鲜少有关于音视频方面的文章，本文是声网 Agora 的高级架构师张乾泽在 RTC Dev Meetup 上的分享，主要介绍 Agora 在 Flutter 实时音视频开发方面的实践经验，整个分享分三部分：

- 基于 Texture Widget 实现思路分析
- 基于 PlatformView 实现思路分析
- 两种方案的性能对比

### 🐎 [对职业发展的一些想法](https://limboy.me/essay/2019/04/15/career.html)

职业发展是每一个职场同学都会去思考的很重要的问题，我们也常常说有时候选择比努力更重要，除了个别的运气成分外，我们能过左右的就是如何去做选择。本文是 limboy 对职业发展的一些看法，从**稀缺度**和**剩余市场空间**这样两个角度去谈，结合生动的坐标图，让人一看就很明了。

### 🐕 [How to run a single test in Xcode](http://www.mokacoding.com/blog/running-one-test-in-xcode/)

[@老峰](https://github.com/GesanTung)：本文作者归纳总结了在 Xcode 中运行单元测试的一些小 tips：

- 通过 gutter （左边列）
- 通过 shortcut （快捷键 ^ ⌥ ⌘ U）
- 通过 scheme
- 通过 terminal
- 通过开源测试库如：[Quick](https://github.com/Quick/Quick)

### 🐕 [iOS 中的 Promise](https://juejin.im/post/5cb6d1215188253fdd641c15)

[@四娘](kemchenj.github.io)：当你需要连续地执行多个异步过程时，总会无可避免的出现地狱回调，Promise 是一个不错的解决方案，这篇文章前半部分主要讲了 Promise 具体的实现，后面介绍了一些实用的 API，感兴趣的朋友可以看一下。

### 🐎 [Preventing Infinite Loops in Swift Property Observers](https://theswiftness.com/preventing-infinite-loops-in-swift-property-observers/)

[@张嘉夫](https://github.com/josephchang10)：Swift 的[属性观察器](https://docs.swift.org/swift-book/LanguageGuide/Properties.html#ID262) （即 `willSet` 和 `didSet` hook 函数）非常实用，可以用于验证、通知和调用 log 方法等等，适用于结构体、类和枚举。但在使用强大的属性观察器时，要避免搬起石头砸了自己的脚，这篇文章会为你介绍如何避免在 Swift 属性观察器中创建无限循环。

### 🐎 [如何画出一张合格的技术架构图？](https://mp.weixin.qq.com/s/1hPZacqJuUeElyHiMxa9rw)

画架构图是架构师的第一门课，本文介绍了架构图的各种画法和具体案例，希望让大家在架构图方面的理念和经验得到提升

架构图分类
1. 场景视图：一般就是我们理解的用例图
2. 逻辑视图：一般是组件图和类图
3. 物理视图：一般是部署图
4. 处理流程视图：一般是时序图和流程图
5. 开发视图：一般是包图

好的架构图：好的架构图是不需要解释的，它应该是自描述的，并且要具备一致性和足够的准确性，能够与代码相呼应

最后推荐 [C4官网](https://c4model.com/)，有各种画图的模板可以参考

## 工具

### [MTHawkeye](https://github.com/meitu/MTHawkeye)

[@looping](https://github.com/looping)：MTHawkeye 是美图 iOS 团队开源的调试和性能优化辅助工具集，旨在帮助 iOS 开发者提升开发效率、优化性能体验。目前已经包含对内存、CPU、电量、网络等的使用监控。由于该工具模块采用了可扩展的插件式设计，所以我们也可以根据自己的需求定制合适的开发调试插件。详细介绍可以参考这篇文章 [MTHawkeye：美图开源的iOS调试辅助、性能优化工具集](https://mp.weixin.qq.com/s/J0tgozOFpm7bBrH8RxOp5Q)。

## 代码

### [Swiftshield](https://github.com/rockbruno/swiftshield)

[@oldonkey](https://github.com/olddonkey)：这是一套代码混淆工具，作用是加密工程的函数和类名，来免疫一些逆向工程。加密的原理很简单，就是把所有函数和类名都替换成一段新的字符串。此工具可以加密，也可以解密，以方便对 Log 进行 Debug。

## 开源库

### [IkigaJSON](https://github.com/Ikiga/IkigaJSON)

IkigaJSON 是一个非常快的 JSON 解析器，它的解析速度大概是是 Foundation 中对应组件的 4 倍。它也提供了 SwiftNIO 的支持（同时也依赖 SwiftNIO），你可以直接从 `ByteBuffer` 对象初始化需要的 JSON 。

## 音视频

### [ggtalk | 聊聊我们的编程启蒙经历](https://talk.swift.gg/27)

[@J_Knight_](https://github.com/knightsj)：本期 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 。

## 说明

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

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


