# 老司机 iOS 周报 #76 | 2019-07-22

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

## 新闻

### 🌟 🐢 [Facebook 发布全新 JS 引擎！专注提高 React Native 应用的性能](https://mp.weixin.qq.com/s/0KxLQjI0jWxSt7sLqkS6Hw)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：React Native 作为老牌的跨端开发解决方案，在跨端开发技术栈中的地位一直稳如泰山，最近 Facebook 发布了全新的 JavaScript 引擎 - Hermes，其专注于提高 React Native 应用的性能，之前一直诟病 React Native 性能问题的同学们可以试试了，小编友情提示：本次发布的 React Native 0.60 版本还有其他惊喜。

## 文章

### 🌟 🐢 [SwiftUI：苹果的一次天才尝试](https://mp.weixin.qq.com/s/xcPBHcpPhgwoR2U7WpWoPA)

[@Parsifal](https://weibo.com/parsifalchang)：作者使用 SwiftUI 构建网易严选的 iPad 版本后，回过头来假设自己是 SwiftUI 设计者，来循序渐进分析 SwiftUI 是如何博众家之长以现在的样子亮相 WWDC19。SwiftUI 有两个最突出的特点：基于 Swift 的 DSL 以及基于数据流驱动的编程范式，文中则也是从这两个点出发，分析了现阶段流行的各类语言采取的方案，且猜测了苹果是如何从这些方案中找到最适合 SwiftUI 的解决思路。SwiftUI 得益于 Swift 对其的全力支持，使得更容易设计出对开发者十分友好的开发体验。

最后，作者还在对 SwiftUI 的评价中提出了一个比较有意思的观点 - “Combine 所提倡的响应式编程不适合处理 UI、交互逻辑”。响应式编程是使用异步数据流进行编程，它把从用户触发交互到逻辑处理再到交互反馈用户，当做信号源触发的逻辑链路上的数据变化进行处理，而 Combine 正是苹果借鉴了目前社区内的多种实现方案完成的为 SwiftUI 配套定制的数据管理方式。那么苹果最终所选择的这种编程范式，是否真的适合 SwiftUI 呢？又或者说如果不用 Combine 我们有没有其他更合适的选择？作者抛出了一个很值得大家继续讨论的观点。

> 关于响应式编程，周报编辑 [JasonYu](https://weibo.com/jasonyuh) 曾写过 - [为什么需要 Reactive Programming？](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/Reports/2019/%2366-2019.05.06.md) 一文，也很值得大家品味。

### 🐕 [[译] 使用 Swift 5 构建 iOS 移动端群聊 App](https://juejin.im/post/5d2c6e846fb9a07ebb0564ae)

[@老峰](https://github.com/GesanTung)：本文介绍了以 PubNub SDK 基于类 MQTT 的消息订阅发布即时通信协议构建匿名聊天应用的实现过程，采用 Swift 5 简易实现了消息实时发送接收，存储历史消息功能，感兴趣的读者可以点这里[查看源码](https://github.com/SambaDialloB/PubNubChat)。

> [🚧 PubNub](https://www.pubnub.com/docs/swift/pubnub-swift-sdk)：为移动终端和网络应用开发提供实时信息通讯服务，现已有 70 多个 SDK，可以支持各种 App 和服务集成进自己的网络，提供每个月一百万条免费的消息。

### 🐕 [Building a Trello-like iOS App with Drag & Drop API](https://www.appcoda.com/drag-and-drop-api/)

[@张嘉夫](https://github.com/josephchang10)：AppCoda 的教程，教你如何用 Drag & Drop API 来构建一个类似 Trello 的 iOS App。如果我们想让用户能够在屏幕上来回移动数据，那拖拽就是最自然的交互方式，Trello、Jira 等 app 大量采用了拖拽的交互方式。在 iOS 11 SDK 发布之前，iOS app 的拖拽功能实现非常复杂，也很难让体验足够流畅。但从 iOS 11 开始，Apple 终于在 Cocoa Touch SDK 中提供了方便使用的 Drag & Drop API。


### 🌟 🐎 [KVO在不同的二进制中多个符号并存的Crash问题 | SatanWoo](https://satanwoo.github.io/2017/09/11/KVO-CRASH/?nsukey=CGyordgRh0EV35bjBYi99dHiMuqF1xt%2BtRsP%2FuGBF7IlcF2xAPOWpoImKYOT%2FxRuycrPVoVq%2FAxxvVxVwandzgpmXxbcdacSBLOG2moVviVdV3iK1Wr6sfqIHRWSsJZHtiX5uyyn8g5bNuRNQVJ2ow7eT%2FLYHcfZOXOdcX8m0R5lQwwNwX7PanbfrnV1dPAmU2CwRfiaiYpGGCZYQCxmxg%3D%3D)

[@莲叔](https://weibo.com/aaaron7)：熟悉 iOS 动态库的同学都知道，由于iOS 的机制设计，在主文件和动态库中是允许存在同名类的，但这个机制也有潜在的坑，既和 KVO 的机制存在冲突，导致 crash。本文作者详细分析了这个坑的来龙去脉，并附带介绍了很多 iOS 的 runtime 相关知识，信息量很大，推荐阅读。

### 🐢 [Swift5.0 的 Runtime 机制浅析](https://juejin.im/post/5d29fb63e51d4510aa01159d)

[@AidenRao](https://weibo.com/AidenRao)：Objective-C 的 Runtime 机制大家了解的比较多，而 Swift 底层原理研究文章比较少。作者通过与 OC 的对比，以及将程序运行时的汇编代码，翻译成 C 语言伪代码，向你解析 Swift 中内部对象是如何创建的，方法以及函数调用又是如何实现，成员变量的访问以及对象内存如何布局。

### 🐎 [Better Storyboards with Xcode 11](https://useyourloaf.com/blog/better-storyboards-with-xcode-11/)

[@J_Knight_](https://github.com/knightsj)：本文介绍了苹果在 Xcode 11 中，关于 Storyboard 的两个改进。第一个改进是 Segue Action。在 Storyboard 跳转之前，我们可以使用 Segue Action 来手动初始化目标控制器。第二个改进是 instantiateViewController 方法。在 iOS 13 以后，我们可以使用这个方法提供的构造 block 来实现我们的自定义控制器的构造函数。

### 🐎 [如何写出让同事无法维护的代码？](https://mp.weixin.qq.com/s/dHu36KMryF3HFPcMUXLnqA)

[@tom510230](https://xiaozhuanlan.com/u/6682065345)：本文举出了大量的例子，来阐述糟糕的代码长得什么样，有以下六个部分

1. 程序命名：糟糕的命名带来糟糕的阅读心情
2. 伪装欺诈：表面和行为不一致会让代码维护性下降很多
3. 文档和注释：文档和注释跟代码一样需要维护
4. 程序设计：多看看最佳实践会让代码写起来更优雅
5. 测试：测试先行对于代码质量有很大的帮助
6. 其他

总体而言，如果以上的例子全部都避免了，那代码的可读性就非常强了，读者不妨看看自己的代码，有哪些地方命中了文中的 bad case ，并做出相应的修改。

## 工具

### [2019年最优秀的JIRA项目管理工具替代方案](https://mp.weixin.qq.com/s/zYfBXRfjI4eLNK6BX6vY-Q)

[@anotheren](https://github.com/anotheren)：项目管理是大家到一定阶段后所必须面对的。本文列举了 12 种可以替代 JIRA 的项目管理工具。如果你还没有用过任何一种，是时候尝试一下了。

### [SwiftUI-Cheat-Sheet](https://github.com/SimpleBoilerplates/SwiftUI-Cheat-Sheet)

[@水水](https://www.xuyanlan.com/)：一个 SwiftUI 相关的一些 API 使用示例，当你使用 SwiftUI 时，可以快速获取到相关代码用于参考。

### [XCAssetsKit](https://github.com/natmark/XCAssetsKit)

[@JimQ](https://github.com/waz0820)：.xcassets 解析器，Swift 实现。.xcassets 的功能越来越强大，系统也提供了很多工厂方法去使用其中的资源，比如 `UIImage(named:)`。但新增的 API 无法用于旧版系统，比如 `UIColor(named:)`，iOS 11 以下就无法使用。这个时候 XCAssetsKit 就派上用场了，它可以精准读取 .xcassets 中的资源，用于各种自定义需求。目前已支持几种常用的资源解析，仍在不断完善。

## 代码

### [NSAttributedStringBuilder](https://github.com/ethanhuang13/NSAttributedStringBuilder)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：这是使用 SwiftUI 样式语法实现的 NSAttributedString 功能，和传统上使用 NSAttributedString 不同，现在使用 NSAttributedStringBuilder，可以使用类似 SwiftUI 的语法来声明 NSAttributedString。除了更清晰的 NSAttributedString 语法之外，由于 NSAttributedStringBuilder 使用了函数构造器，它还允许 API 在 UIViewRepresentable 中构建组件。

### [Runtime](https://github.com/wickwirew/Runtime)

[@四娘](https://kemchenj.github.io)：一个基于 Metadata 的 Swift 运行时库，可以很方便地查看类型信息，并且动态地调用属性 getter 和 setter：

```swift
let info = try typeInfo(of: User.self)
let property = try info.property(named: "username")
let username = try property.get(from: user)
try property.set(value: "newUsername", on: &user)
```

## 内推

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


