# 老司机 iOS 周报 #71 | 2019-06-17

![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 13 Preview](https://www.apple.com/ios/ios-13-preview/)

[极速男孩007](https://github.com/ztlyyznf001)：在 WWDC 2019 上苹果发布了全新的 iOS 13 版本：

主要带来了一下功能：

  - 大家期盼已久的黑暗模式。提升了夜晚的视觉效果。
  - 人像拍照更多的功能，并且可以通过日期去筛选照片。
  - 全新的苹果登录功能，使你的信息更加安全。
  - 全新的 map 带来更多的地图细节，和 360° 的全景街景。
  - siri 声音变得更加自然，并且能通过 homepod 识别各个家庭成员的声音。
  - App 启动速度会比以前快两倍，并且会有更小的包的大小。
  - ARKit 3 支持人的动作识别，并且支持人和虚拟景象的结合。

### 🚧 [Why Did Apple Reject My App? Ex-Head of App Store Review Explains](https://www.bloomberg.com/news/articles/2019-05-28/why-did-apple-reject-my-app-ex-head-of-app-store-review-explains)

[@anotherene](https://github.com/anotheren)：App Store 审核团队的前负责人讨论了为什么应用程序被拒绝，Apple 和 开发人员之间的竞争以及 WWDC 的规划。

## 新手推荐

### 🌟 🚧 [SWIFTUI BY EXAMPLE](https://www.hackingwithswift.com/quick-start/swiftui)

[@邦Ben](https://weibo.com/linwenbang)：WWDC 最受瞩目的莫过于的 SwiftUI 了，虽然这可能三年后才有机会普及。

作者 [Paul Hudson](https://twitter.com/twostraws) 非常速度的给出来大量的学习例子（涵盖了日常需要用到的内容，例如：文本图片，列表容器，弹窗，动画，视图形变，状态等等），并且还有录制了学习视频，可谓是干货满满。

其他参考：

- [Learn SwiftUI with free tutorials](https://www.hackingwithswift.com/articles/196/learn-swiftui-with-free-tutorials)

## 文章

### 🌟 🐎 [Thoughts on SwiftUI](https://mackuba.eu/2019/06/14/thoughts-on-swiftui/)

[@zvving](https://github.com/zvving)：作者 [Kuba](https://mackuba.eu/about) 是一名资深的 macOS&iOS 开发，整理了对 SwiftUI 的一些思考：

上手所面临的困难：

  - 你可能需要把自己当成 macOS&iOS 开发新手，哪怕忽略开发范式的变化，熟悉新的 framework 也需要时间
  - 有很多细节问题需要进一步探索：如面对复杂布局不知道如何开始；属性的 $ 如何使用？修饰符的排列顺序有什么影响？等等
  - 工具现状：仍处于测试版状态，文档不完善，错误消息很神秘，自动提示在一半的时间里无效

看好未来的可能性：

  - 对 SwiftUI 提升 UI 开发效率充满信心，相信能节省开发时间，避免出错
  - 很好的是苹果没有简单地把 11 岁的 UIKit 抹平差异，迁移到所有平台。而是重新设计一个 UI 框架，承认并强调每个平台的独立性，把有共性的好的体验统一定义，不通用的部分为每个平台提供自定义的可能。就像他们所提倡的那样：『并不是：Write once, run anywhere，而是 Learn once, apply anywhere』
  - 期望保持 macOS Apps 优秀体验的同时，SwiftUI 为其带来更多的可能性
  
### 🌟 🐎 [Will Combine kill RxSwift?](https://medium.com/flawless-app-stories/will-combine-kill-rxswift-64780a150d89)

[@Damonwong](https://github.com/Damonvvong): 今年的 WWDC 不但出了 SwiftUI 这个重量级框架，还出了一个官方的 ReactiveX 库 Combine，作者也将 Combine 和目前社区较为流行的 RxSwift 做了以下对比：

- Combine 支持 Backpressure 特性，而 RxSwift 不支持
- Combine 和 RxSwift 在错误处理上有所不同，相比较而言 Combine 需要更明确的错误类型
- Combine 不需要使用 DisposeBag 来管理内存问题
- Combine 和 RxSwift 在 API 上还是有所差异的
- Combine 在性能上有一点「碾压」的趋势
- ...

综合比较起来 Combine 虽然还处于 beta 及 iOS 13+ 的阶段，但是各方面似乎都要比 RxSwift 都要稍微好一点。

最后谈一下我自己对 ReactiveX 的看法。在 Combine 这库出来之前，我对 RxSwift 的定义为「毒瘤」。什么意思呢？就是一旦一个项目中一个库引入了 RxSwift 你会发现渐渐的所有的库都会依赖它，以至于想去也去不掉。再加上不同水平的人对 ReactiveX 理解不同，行业中也没有一个很好的规范来约束，以至于项目中的 RxSwift 代码质量参差不齐，难以维护。所以虽然我们项目中引入了 RxSwift 但是我还是会有所克制的去使用 RxSwift。但是 Combine 的出现，彻底打消了我这些顾虑，Combine 的出现是苹果开发团队对 ReactiveX 的肯定，而且 SwiftUI 也依赖于 Combine，所以我觉得对 ReactiveX 充分理解，不再是一个考察开发者能力的可选项，而是一个必须要掌握的技能。如果你还没有开始了解 ReactiveX 那么 RxSwift 是一个不错的选择。

以至于 RxSwift 会不会被 Combine 替代？谁也不知道。把答案交给明天。

### 🌟 🐕 [WWDC 2019](https://nshipster.com/wwdc-2019/)

这是著名的 AFN 作者 Matt 大神写的博客，主要是针对```WWDC 2019 keynote```中的内容进行了一些解读和展望，如果你对于```WWDC 2019 keynote```已经比较了解了，那么看这篇文章可以帮助你更好地知道苹果新技术的一些思想，如果你不太了解，建议先到[苹果官网](https://developer.apple.com/videos/play/wwdc2019/101/)了解一番，然后再阅读这篇文章。
这次 wwdc2019 对于开发者来说，最重要的莫过于推出了```SwiftUI```框架，重新定义了 UI 层的工作流程，因此 Matt 大神也着重提到了这点。具体来说就是苹果终于对于声明式编程方式提供了合理的支持途径，是可喜可贺的一步。
另外一个重大的变化就是 iPad 应用移植到 Mac 平台将会变得更加方便了，苹果称呼这个项目叫```Project Catalyst```，具体的内容，在 WWDC 的 session 上面都有提及，譬如 [Session235](https://developer.apple.com/videos/play/wwdc2019/235/) 和 [Session205](https://developer.apple.com/videos/play/wwdc2019/205/)。
作者在文章的最后再次强调了，今年 iOS 开发者要关注的重点，无疑就是 SwiftUI 和 Swift5 ，如果现在还没有对这两个方向给予足够的重视，那在技术上就很容易被拉开差距了。

### 🌟 🐕 [First impressions of SwiftUI](https://www.cocoawithlove.com/blog/swiftui.html)

[@olddonkey](https://github.com/olddonkey)：本文以一个类 SwiftUI 开源库的作者的角度出发，来介绍了一下自己对 SwiftUI 的第一印象。

作者在几个月前写了一个叫 CwlViews 的开源库，也是使用了声明式的设计思路，目标以简单的声明来快速构建 UI 组件。但是作者的设计思路与苹果的设计思路却并不完全相同。例如 SwiftUI 采用的是双向绑定，而作者采用的是单向绑定。再比如 SwiftUI 采用了 Value Type，而 CwlView 则因为 Binder 的原因，不得不选择引用类型。

以上这些比较最后让作者不得不做出一个“艰难”的决定：长远来看，作者将会放弃自己的开源库。但是在最低版本支持是 iOS 13 或 macOS 10.15 之前，SwiftUI 也会遇到很多的问题。而这些问题，都需要时间来完善。

### 🐎 [一招教你解决 FlutterPlatformViews 内存泄露问题](https://mp.weixin.qq.com/s/2CRirw1hxjJDD6e2d8xodQ)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：PlatformView 是 flutter 总一个非常酷炫的功能，使用 PlatformView 你可以贴一个 native 的控件到 flutter 的 render tree 中，这给了开发者无限的想想空间，但同时也带来一些坑点，比如内存问题，本文通过对 OpenGL 层面的探索发现并解决这一问题。

### 🐎 [How To Adopt Dark Mode In Your iOS App](https://www.fivestars.blog/code/ios-dark-mode-how-to.html)

[@J_Knight_](https://github.com/knightsj)：本文作者从使用条件，颜色，图片，代码层面上的 UIVisualEffectViews，NSAttributedString，以及调试方法几个方面讲解了如何使 APP 采用 Dark Mode。

### 🐢 [Property wrappers to remove boilerplate code in Swift](https://www.avanderlee.com/swift/property-wrappers/)

[@享耳先森](https://github.com/iblacksun)：`Property wrappers` 是在 WWDC 2019 随 Xcode 11 和 Swift 5.1 一起发布的，提案可以参考 [SE-0258](https://github.com/DougGregor/swift-evolution/blob/property-wrappers/proposals/0258-property-wrappers.md) 。

本文举例使用 `Property wrappers` 实现一个 `@UserDefault` wrapper，用来解决 UserDefault 读取与存储包含大量模板代码的问题，另外，Swift UI 也利用了 `Property wrappers` 实现 View 与 Model 的动态绑定。

### 🐕 [Swift Combine 入门导读](https://icodesign.me/posts/swift-combine/)

[@老峰](https://github.com/GesanTung)：Combine 是 WWDC19 Apple 官方推出的基于 Swift 的响应式编程框架。

本文浅显易懂的介绍了 Combine 中 Publisher 、Subscriber 、Subject 、Cancellable 等基本概念，作为作者 Combine 系列的第一篇很适合响应式入门级的读者阅读。

### 🐕 [新晋网红 SwiftUI —— 淘宝带你初体验](https://mp.weixin.qq.com/s/x_jFcKeXSbtdK0CnfayFsw)

在刚刚过去的 WWDC 2019，苹果为我们带来了很多惊喜，其中最引人注目的内容莫过于 SwiftUI 了。从学习 iOS 开发开始， UIKit 就一直伴随着我们。UIKit 是基于命令式的，而近年来，声名式和函数式方式来进行界面开发已经越来越普及，例如最近很红的 Flutter 。我想很多开发者都在期待苹果官方能够出一套类似的技术方案，这不，它就到来了。淘宝团队也在第一时间体验了 SwiftUI 并带了这篇文章，对于还没有去了解 SwiftUI 的同学，推荐看一看。不过，SwiftUI 虽然很棒，但是 Only iOS13 哦。

相关阅读：

[WWDC 2019 - Session 722：Introducing Combine](https://developer.apple.com/videos/play/wwdc2019/722/)

### 🐎 [Solving-ambiguous-constraints-without-rerunning-your-app](https://mar.codes/2019-05-28/Solving-ambiguous-constraints-without-rerunning-your-app)

[@jinmq](https://github.com/waz0820): 本文介绍了使用 View Debugger + LLDB 的方式去定位并消除有歧义的 Auto Layout 约束，而不必每次尝试都重跑你的应用。

### 🐎 [WWDC 2019 Session Notes](https://github.com/Blackjacx/WWDC)

每年的 WWDC ，issue 都多达上百个，作者整理了几十个比较热门的 issue 内容，写成大纲供没什么耐心看完视频的开发同学进行快速预览。大部分的内容都还不错，美中不足的是没有附带图片，可能有一些知识点是不太好理解的，更推荐由各位 iOS 网红整理的 [WWDC精读文章](https://xiaozhuanlan.com/wwdc19) ，另外，[ASCIIwwdc](https://asciiwwdc.com/) 也是很不错的索引网站喔。

## 代码

### 🌟 [RxCombine](https://github.com/freak4pc/RxCombine)

[@四娘](https://kemchenj.github.io)：RxSwift 社区推出的一个用于与 Combine 进行交互的框架，提供了 Observable 与 Publisher 相互转化的功能，目前还是属于概念验证阶段。

### 🌟 [RxSwift to Combine Cheatsheet](https://github.com/freak4pc/rxswift-to-combine-cheatsheet)

[@Damonwong](https://github.com/Damonvvong): 这是一个 RxSwift 和 Combine 库 API 的对照表，如果你对 RxSwift 的 API 已经很熟练了，那么这个仓库的对照表可以让你很快上手 Combine。

### [Swift-Docker Slim Images](https://github.com/apple/swift-docker/pull/140)

[@张嘉夫](https://github.com/josephchang10)：Swift Docker 镜像的精简版本，适用于 Ubuntu 16.04 和 18.04，去掉了编译器只保留 runtime，镜像从 1.3GB 减小到了 200MB 左右，以便部署。

### [SwiftUI Hooks](https://github.com/unixzii/SwiftUI-Hooks)

[@looping](https://github.com/looping)：这个项目是受到了 [React Hooks](https://reactjs.org/docs/hooks-intro.html) 的启发，想证明下在 SwiftUI 上也能用 Hooks。目前作者已经实现了 useState、useEffect 和 useReducer 这几个 Hook，同时还写了一个 [Todo List](https://github.com/unixzii/SwiftUI-Hooks/blob/master/SwiftUI-Hooks/ContentView.swift#L59) 作为演示。对 React Hooks 技术和理念感兴趣的同学可以持续关注。

### [MovieSwiftUI](https://github.com/Dimillian/MovieSwiftUI)

[@邦Ben](https://weibo.com/linwenbang)：这是一个基于 SwiftUI 并且使用 Flux 架构完成的电影类 App，示例功能都比较完整。

参考链接：

- [Flux APPLICATION ARCHITECTURE FOR BUILDING USER INTERFACES](https://facebook.github.io/flux/)
- [Flux 架构入门教程](http://www.ruanyifeng.com/blog/2016/01/flux.html)

## 内推

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


