# 老司机 iOS 周报 #53 | 2019-01-21

![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 2019 产品路线图正式公布](https://mp.weixin.qq.com/s/nRAF7g3Faz5SvsPJ1A98Iw)

Flutter 的 2019 产品线路图已正式公布，热修复、生态、混合工程，可谓精确打击现有的痛处。特别是热更新，不过更多细节要等到今年的 Google I/O 大会。

## 文章

### 🌟 🐕 [Functional networking in Swift](https://www.swiftbysundell.com/posts/functional-networking-in-swift)

一篇非常不错的、手把手教学的 Swift 函数式编程教程。通过使用 Swift 的函数式特性以及 Future 和 Promise 的思想，一步步的把一个常见的网络请求模型改造得非常优雅，并且整个改造的过程，一步步的减少类型，一步步的减少副作用，使用无状态的函数组合来实现逻辑。从这篇文章也可以看到，函数式编程最重要的是思想，而不是某个具体的库。当我们学会了思想，即便不依赖任何第三方库，我们也可以快速搭建出很 pure，很优雅的架构。

### 🌟 🐎 [关于 Flutter Layout 你应该知道的](https://limboy.me/tech/2019/01/11/flutter-layout.html)

本文介绍了 Flutter 的几种布局方式以及需要注意的问题，介绍了 `Unbounded Constraints`、`Flex`、`Stack` 等。了解文中所提到的这些，基本日常使用 Flutter 关于布局方面的也就够用了。

### 🐎 [Xcode tips and tricks – part one](https://www.hackingwithswift.com/articles/166/xcode-tips-and-tricks-part-one)

本文是 Xcode tips and tricks 系列的第一个合辑，包含了 10 个使用 Xcode 的小技巧。每个小技巧都配有简洁的文本和一个小视频，小视频长度都不超过 20 秒。用这种形式学习小技巧，效果非常不错，简洁直观，一目了然，希望作者一直更新下去。本篇文章不需要翻墙，但观看视频需要翻墙。

### 🐎 [swift-sh](https://nshipster.com/swift-sh/)

Swift 有一个活跃的社区，现在带来了 swift-sh 以供实现脚本功能，同时提供了包管理，且在 GitHub 中开源，见 [mxcl/swift-sh](https://github.com/mxcl/swift-sh)。

- 通过注释 `import DeckOfPlayingCards // @NSHipster ~> 4.0.0` 引入  Github 中 NSHipster 中的 DeckOfPlayingCards 包。
- 可以指定依赖的 remote 地址，`import Remote // https://example.com/Remote.git`。
- `#!/usr/bin/swift sh` 脚本中声明运行方式，swift sh，系统在运行的时候，会去寻找 swift-sh 的执行。
- swift-sh 使用内置 eject 命令简化从脚本到包的转换，`$ swift sh eject ./bridge`。

当前的限制：

- 缺乏从外部模块导入单个声明。

### 🐢 [High Performance Numeric Programming with Swift: Explorations and Reflections](https://www.fast.ai/2019/01/10/swift-numerics/)

利用 Swift 进行数学编程并不是一个很热门的领域，例如训练机器学习模型，但作者经过几周的研究与实验构建了几个数学库，可以达到与精心优化过的矢量化 C 语言相同的速度，同时还能够保持简洁易用。在这篇文章里，作者会为你展示如何使用 Swift 进行有效的数学编程，其中的例子主要都来自 [BaseMath](https://github.com/jph00/BaseMath) 库，这个库为 Float 和 Double 型提供了通用的数学函数。

### 🐎 [客户端单周发版下的多分支自动化管理与实践](https://tech.meituan.com/2019/01/10/traffic-git-branch-management.html)

过去，大多数 App 的发版时间一般为 3 到 4 周，但如今，为了快速验证产品策略，又或者赶固定时间的运营活动，许多产品的发版节奏较过去变得更快。但快速的发版节奏带来的必然是并行开发与工程代码版本管理的一系列问题。本文介绍了美团团队是如何来解决这一问题的，并且基于文中提到的流程已经稳定进行了 10 个小版本的开发。

### 🐎 [【译】Language Server Protocol](https://swift.gg/2019/01/15/nshipster-language-server-protocol/)

这篇文章是 [Language Server Protocol](https://nshipster.com/language-server-protocol/) 的译文版。Matt 大神解释了什么是 LSP，LSP 是怎么工作的，以及潜在的可能带来的好处，我们可以一起重温下。

相关阅读：[Swift Development with Visual Studio Code](https://nshipster.com/vscode/)

### 🐢 [iOS 拾遗——为什么必须在主线程操作 UI](https://juejin.im/post/5c406d97e51d4552475fe178)

我们都知道 UI 相关方法必须在主线程调用，究其原因的或许不多。

本文由浅入深，从多方面阐述为什么不能在主线程操作 UI。包含 `UIKit` 非线程线程安全的设计、`UIApplication` 事件响应、底层 `Core Animation Pipeline`。另外，还介绍了 `Texture` 和 `ComponentKit` 的实现来，希望能够带给大家一点思考。

>推荐人：[杜玮-Dywane](https://github.com/Dywane)

### 🐢 [React Native 工程中 TSLint 静态检查工具的探索之路](https://mp.weixin.qq.com/s/H3GW43s1aOup2J2VQHpqjg)

代码的静态检查，可以在代码的规范性、安全性、可靠性、可维护性等方面起到重要作用。 iOS 可以使用 Clang Static Analyzer 、 OCLint 等工具， Android 可以使用 CheckStyle、Lint、Findbugs、PMD 等工具，而对使用 TypeScript 的 React Native 工程，TSLint 则成为了主要代码静态检查的工具。

本文阐述了使用 TSLint 的原因，并对 TSLint 的使用做了详细的介绍，既可以直接使用 TSLint 的规则，也可以自定义编写 TSLint 规则。使用 TSLint 后可以有效规避一些低级错误，同时可以快速定位问题代码，将开发状态从“亡羊补牢”进化到“防患未然”。

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

代码注释和说明文档对于我们维护和使用类库来讲，都是很有用的。很多时候我们也都是通过导出代码注释作为文档，因为这样能减少重复编写文档带来的额外工作量，也能避免代码和文档描述不一致带来的坑。

本文就介绍了一款能够从 Swift 和 Objective-C 代码中提取注释来生成 HTML 格式文档的命令行工具 —— [Jazzy](https://github.com/realm/jazzy)；同时也介绍了如何通过 Travis CI 来自动生成和部署文档到 GitHub Pages，保证了代码和文档的及时同步。这个思路完全可以用到公司内部的私有工作流程当中，通过工具和自动化提高工作效率。

### 🐎 [不同 WKWebView 之间实现浏览状态隔离](https://oldoldb.com/2019/01/12/Session-isolation/)

很多时候面对 webView 相关的登录状态，大家都是习惯一旦在一个 webView 进行了登录，在创建新的 webView 打开新的页面应该也能做到自动登录同步，这是一个比较常见的用户场景。但本文的作者所面对的场景恰恰是登陆隔离，即一个 webView 保持了登录，其他 webView 不会自动登录，面对这个需求，大家可以看看作者在这里面的研究与探索。

### 🐢 [OBJECT SERIALIZATION IN IOS](https://dmtopolog.com/object-serialization-in-ios/)

在这篇文章中，作者尝试将关于 iOS 开发中主要格式和数据序列化类型的知识系统化。还将 ObjC（NSCoding）与 Swift 4（Codable）的方法进行比较，并列出一些特定的用例，例如它们之间的互操作以及使用复杂对象图的能力。

- 序列化作为一个单独的过程
- NSCoding
- NSCoder 和 NSKeyedArchiver
- JSON
- PLIST
- 其他格式
- Codable
- 一些基准和比较
- NSKeyedArchiver 编码可编码
- 编码复杂的对象图
- Codable 作为 NSCoding 的替代品（作为结论）

## 设计

### [「Keep 设计开发语言」实践与思考](https://mp.weixin.qq.com/s/z880jdHhHeJhMjA6GJAaYQ)

其实这篇文章并不是说编程的，但是依然值得程序员们读一读。为什么呢？因为：

1. 你有多少次和 UX 发生了争执，原因是 UX 不停的改设计？
2. 你有多少次搞不清楚 UI 中元件的布局，大小，对话框的设计要怎么样，然后只能不停的去问 UX 或者 PM？
3. 你有多少次因为代码没有很好的模块化不得写别人写过的重复 UI 元件而加班？

那就是时候在公司内部和 UX 团队一起建立起一套完整的属于你们的设计语言了。这不仅是为了你们的产品质量，更是减少重复劳动，解放程序员的最佳方案。

什么？你问我怎么开始搞？那还不快看看这篇来自 Keep 团队的文章参考参考？赶紧的。

## 工具

### [Bagel](https://github.com/yagiz/Bagel)

Bagel 是一个轻量级的原生 iOS 网络调试器。它的方便之处在于不需要使用证书和设置代理。只要将 iOS 设备和 Mac 电脑连接到同一个网络，就可以在 Bagel 的 Mac 客户端查看当前在 iOS 设备上运行的 APP 的网络通信情况。

### [awesome-mac](https://github.com/jaywcjlove/awesome-mac)

无论你是 macOS 小白，还是 macOS 的高阶玩家，你总能从 awesome-mac 的软件列表中找到一些你没有见到过的实用软件工具推荐。这份列表来自广大开发者的多年积累和精品推荐。它涵盖了日常生活至开发软件推荐一应俱全。

## 音视频

###  [ggtalk | 狭义跳槽论：面试官，大厂新人和准备起跳的某 C](https://talk.swift.gg/12)
本期 ggtalk 聊了程序员非常喜闻乐见的话题，采访了翻译组最近刚跳槽或者准备跳槽的三位同学，聊聊为什么跳槽，跳槽的主要考虑是什么，收益和风险如何权衡。听下来感觉很有共鸣，三位同学遇到的绝大多数情况其实其他程序员也会遇到。最近有跳槽想法的同学不妨可以参考。

### [Swift Community Podcast #1](https://www.swiftcommunitypodcast.org/episodes/1)

两个社区大 V [John Sundell](https://www.swiftbysundell.com)，[Garric Nahapetian](https://twitter.com/garricn) 加上 Swift 创始人之一 [Chris Lattner](https://twitter.com/clattner_llvm)，他们开始了一档全新的博客节目，主讲 Swift 相关的各种内容。

第一期主要讲了这个节目开始的缘由和各自开始钟情于 Swift 的一些小故事。第二期的话题[正在征集中](https://github.com/SwiftCommunityPodcast/podcast/issues/2)，目前评论区里已经有人提出了 TensorFlow / Scripting / Concurrency 等热门话题，大家有感兴趣的话题也可以去贡献一下。

### [一起来开发泊学 App 吧](https://boxueio.com/path/let-us-build-and-launch-a-forum)

如果你正在自学使用 Swift 做 iOS 开发，并期望找到一份相关的工作，但却苦于没有项目练手和熟悉整个 App 的开发流程。或者你十分向往成为一个独立开发者，但又不知从何开始。又或者你想看看 Swift 充当服务端开发语言时会有怎么样的表现。那小编十分推荐你看看泊学上的这个系列视频，你得到的会远比一些培训班得到的多。目前已经推出以下 4 个系列，且内容仍在持续更新中：

- [设计 iPhone 版泊学 App](https://boxueio.com/series/design-boxue-app-from-scratch)：基于 Apple 官方的 iOS design guideline，我们用 Sketch 从零开始设计泊学自己的 iOS App。在这个真实的项目中，了解 Sketch 的使用经验和常用插件。
- [Vapor Up and Running](https://boxueio.com/series/vapor-up-and-running)：如果，你已经掌握了 Swift 编程语言，再用它学习服务端开发，就变成了一个性价比很高的事情。这个系列里，我们会从零开始，基于 Vapor，详细地讲述每一个服务端开发领域常用的技术场景。
- [Vapor Fluent](https://boxueio.com/series/vapor-fluent)：在这个系列里，我们会实现一个类似论坛的 App。通过这个过程，来了解 Vapor 中的 Fluent 组件。通过它，我们就可以无需了解 SQL 的细节，而是用 Swift 的方式和数据库打交道。
- [基于 MVVM 构建泊学 App](https://boxueio.com/series/build-boxue-app-in-mvvm)：在这个系列里，我们以实现 Boxue App 举例，以一个独立开发者的视角，尽可能在代码的可维护性、可测试性、可重用性以及可协作性，达成让自己满意的实践。

## 内推

- [北京-百度网盘 持续招 iOS 开发](https://talent.baidu.com/external/baidu/index.html#/jobDetail/2/102507)：社招、应届、实习均可。项目在技术上很有挑战性，团队技术氛围极好。诚心希望各路大神前来切磋，也欢迎计算机基础好的小白来共同学习。简历发邮箱 xuyafei01@baidu.com，暂不考虑的也欢迎微博私信 [@小非86](https://weibo.com/xuyafei86) 聊聊~

- [北京-蚂蚁金服 招iOS/安卓/前端开发](https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP031268&from=timeline&isappinstalled=0)：负责支付宝会员及帐号业务线，地点北京国贸，金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到：weijing.wdf@alibaba-inc.com / weijing.wdf@antfin.com （同一个邮箱）或者微博私信 [@折腾范儿_味精](https://weibo.com/agvicking) 了解情况。

- 上海即刻：如果你认识聪明勤奋、胆大心细、有追求的工程师，那就来加入我们吧！任何推荐或简历可直接发给 Jason（即刻 iOS leader）: jasy@okjike.com，或微博 [@JasonYuh](https://weibo.com/jasonyuh)。

- [杭州奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)：奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

- [深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目](https://job.toutiao.com/2018/spring_referral/?token=alPR8WCv8nnnc5QqtsyKjw%3D%3D&key=MTY1MDMsMTg0MTQsMjA1MjAsMTk1NjEsMTU2ODksMTc0ODk%3D)：如想了解更多深圳头条的信息，可以加小T微信：tomtan，切磋技术和聊情怀都可以喔~~~~

- [北京字节跳动 iOS 团队持续招人中](https://job.toutiao.com/society)：简历可以发送到邮箱 raozhizhen@gmail.com，或者添加我（[@AidenRao](https://weibo.com/AidenRao)）的微信 jingmu1994 了解更多公司及岗位信息。

- [北京百度教育事业部招 iOS 开发](https://www.baidu.com/s?wd=百度)：百度教育事业部，地点：北京西二旗。部门下面有百度阅读，百度文库，百度爱听等 App 产品。团队技术氛围浓厚，有兴趣的同学欢迎将简历发送到我的邮箱：lizelei@baidu.com。

## 关注我们

我们开通了公众号，每期发布时公众号（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://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@方秋枋](https://weibo.com/100mango)，[@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)，[@XanderXu](https://github.com/XanderXu)，[@老峰](https://github.com/GesanTung)，[@zvving](https://github.com/zvving)，[@J_Knight_](https://github.com/knightsj)

## 说明

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

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