# 老司机 iOS 周报 #57 | 2019-03-04

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

## 老司机周报 LOGO 全面更新！

首先非常感谢 [@SketchK](https://github.com/SketchK) 为我们设计的十分贴合『老司机』一词的重金属风格 LOGO。几经波折，我们终于可以对外发布我们的全新 LOGO 了，而且版权已经注册并完成审批，希望这次不会再翻车！作为 LOGO 的设计者 [@SketchK](https://github.com/SketchK) 他对此次设计以及周报有一份自己的理解，以下是他的想法，而我们聪明的读者会怎么解读这个 LOGO/Banner 呢，欢迎留言告诉我们~

> @SketchK：在设计之初，问了一些身边的朋友，老司机在你心里是什么样子的？有的朋友说老司机是那种熟悉道路，开车老练的出租车司机，也有朋友说老司机应该是那种带大家搬砖致富的卡车司机，当然也有人说老司机就是那种饭桌上带大家开“车”的司机。但对于我而言，提到老司机或者老司机周报，我脑海里浮现的画面是：一个校车司机每天带着一波热爱 Swift 的人去探索当今最前沿，最有趣，最具挑战性的知识和技术。而我们这些每天阅读老司机周报的人就是这辆校车上的学生，充满了对未知领域的好奇与热情。大体是因为有了这个想法，才有了最后的这个 LOGO 设计稿。最后呢，希望老司机周报的读者能喜欢这个 LOGO，也希望大家能继续支持老司机周报这个组织，更希望 Swift 这门语言能够被更多的人所熟知和喜爱。

## 话题

### [#1 上周话题 | Swift ABI](https://github.com/SwiftOldDriver/iOS-Weekly/issues/1183)

> [读者 | @alexlee002](https://github.com/alexlee002):
> 
> 新项目可能会优先选择 swift, 但得看对公司原有技术栈的依赖程度。ABI 稳定是一个里程碑，如果 OC 和 swift 相互调用能做到 Java 和 Kotlin 那样就更好。

> [周报编辑 | @tom](https://xiaozhuanlan.com/u/6682065345): 
> 
> 对于我们来说暂时没啥意见的，毕竟我们早就已经 all in swift 了。我们选型 Swift 还是从性能上面考虑的，相机应用对于代码速度和 crash 率有挺高的要求的。对于相机应用来说，性能提升几十毫秒也很牛逼了。这样子可以让相机帧率从 50 变成 53，用户体验棒棒哒。

**最后，强烈推荐 [周报编辑 |@四娘](https://kemchenj.github.io) 对 [Swift ABI 的看法](https://github.com/SwiftOldDriver/iOS-Weekly/issues/1183#issuecomment-469083106)。**

**如果你也有什么关于 Swift ABI 的看法，也可以在我们的 [Github Issue](https://github.com/SwiftOldDriver/iOS-Weekly/issues/1183) 上评论，与周报编辑一起讨论。**

### [#2 本周话题 | 协程](https://github.com/SwiftOldDriver/iOS-Weekly/issues/1205)

说起协程，很多人可能还比较陌生，它是一个 60 年代就已经提出概念，是一种在非抢占式多任务场景下生成可以在特定位置挂起和恢复执行入口的程序组件。

目前在服务端中应用比较广泛，在高并发场景下使用极其合适，可以极大降低单机的线程数，提升单机的连接和处理能力，而在移动研发中，前端的 JavaScript，安卓的 kotlin 也都已经支持了协程，唯独对于 iOS 来说，Swift 的语言级协程支持还在路上，苹果官方也没有意愿给 objective-c 添加协程能力的意愿。

好在，上周阿里巴巴也开源的 [coobjc](https://github.com/alibaba/coobjc) 为我们 iOS 开发者解决了这个困惑， [coobjc](https://github.com/alibaba/coobjc) 同时给 objective-C 和 swift 都提供了协程功能。

**所以这周想和大家一起探讨一下协程相关的问题。欢迎大家移步到 [#2 本周话题 | 协程](https://github.com/SwiftOldDriver/iOS-Weekly/issues/1205) 和我们一起探讨。**

## 新闻

### [Flutter 1.2 发布，带来全新的 Web 开发工具！](https://mp.weixin.qq.com/s/gdKSJw05RPUSkLpeVlO6hg)

Flutter 从去年开始，势不可挡，一路突飞猛进。Flutter 团队也一直不停的拓展着 Flutter 的应用范围，努力实现着 Flutter 更多的跨平台需求。

在 MWC 2019 上，Flutter 1.2 正式亮相，这次的最大的亮点是提供了新的 Web 开发工具。这个开发工具也会在之后加入到 VS Code 等其他开发工具中去。

### [CocoaPods-1.6.0](http://blog.cocoapods.org/CocoaPods-1.6.0-beta/)

CocoaPods 1.6.0 有以下两大更新：

1. 编译设置的生成部分被完全重写：在一个比较大的项目中，使用重写过的该版本执行 pod install 的时间比之前的版本降低了 77%。
2. 1.6.0 开始会为每个测试 spec 生成一个单独的测试 target，而不是像之前把多个测试 spec 合并为一个测试 target。

另外，1.6.0 存在一个链接失效的 bug，已在后面的 1.6.1 版本解决，详情：[CocoaPods/issues/8493](https://github.com/CocoaPods/CocoaPods/issues/8493)。

## 文章

### 🌟 🐢 [阿里开源 iOS 协程开发框架 coobjc 源码分析](https://mp.weixin.qq.com/s/Vy_fsn95dgag4KumpQPlTw)

阿里开源了 [iOS 协程开发框架 coobjc](http://gitlab.alibaba-inc.com/Coroutine/coobjc)

参与一些大前端开发，写了很多 js 的同学们，相信对 ES6 的新特性 async await 是非常的喜爱，能够允许你在同步的代码逻辑中，书写异步的代码。一般这种协程能力有的是语言层面直接支持，有的来自于框架。如今淘宝团队的大神们为 iOS 的 Objective-C 的语言也带来了协程框架。“当你还在写 UI  Button 写界面的时候，别人已经在用汇编写 iOS 语法库了”，没错 coobjc 在 OC 的基础上通过汇编对寄存器的直接控制，来保存/中断/挂起/恢复一段逻辑的上下文，从而实现上下文的切换，再加上编译器与语法糖的扩展，实现了在 OC 中的 async await 等语法关键字的支持，更详尽的分析请看[“知识小集”的这篇源码分析](https://mp.weixin.qq.com/s/Vy_fsn95dgag4KumpQPlTw)。

### 🐕 [Parallel Computation using MPS](http://yulingtianxia.com/blog/2019/02/28/Parallel-Computation-using-MPS/)

在图像处理任务上，GPU 一直以来都比 CPU 优异一个数量级。Metal 是苹果官方推出的 GPU 计算框架, 并提供了一套名为 Metal Performance Shader 的 API 接口，能够让开发者非常方便的使用 Metal 处理图像处理的任务。本文作者比较了使用 MPS 对比传统 CPU 的耗时，发现前者相比 CPU 耗时降低了 99.9%，之后介绍了 MPS 运行的基本原理并给出了一些 MPS 的编程技巧，做多媒体开发的同学不要错过。

### 🐕 [UIView styling with functions](https://felginep.github.io/2019-02-19/uiview-styling-with-functions)

在实际 App 中，视图通常只有几种样式，你可能会想各种办法做成视图组件。本文介绍了一种视图样式封装的方法，利用 Swift protocol extension 等特性组织代码，使得代码逻辑清晰易懂。

### 🐕 [Swift 5 Type Metadata 详解](https://juejin.im/post/5c7513e7e51d451ac30154aa)

Swift 5 发布以后，ABI 变得更加稳定了，尽管依然与早期的版本是二进制不兼容的。其中对 Metadata 也有不少改动，对于有些项目，可能使用了强依赖 Metadata 的库，这就需要我们加以修改。本文作者就通过查看源码，回顾了 Metadata 的前世今生，可能会对读者很有借鉴意义。

### 🐕 [Using CLion as an IDE for Server-Side Swift Apps on Linux](https://www.raywenderlich.com/9363-using-clion-as-an-ide-for-server-side-swift-apps-on-linux)

CLion 是 JetBrains 全家桶中的一员，也是 Linux 上比较好用的 IDE 之一。本文以 Vapor 框架为例，完整介绍了在 Ubuntu 上搭建环境、调试和连接数据库，如果你也想试试 Ubuntu 上的开发体验，不妨一读。

### 🐕 [API Pollution in Swift Modules](https://nshipster.com/swift-api-pollution/)

本周 NSHisper 讨论的是 Swift 导入 Module 时可能发生的 API 污染，Swift 的静态方法查找是发生在编译时的，有时候可能会因为函数的声明不当，而导致意外情况的发生，例如我们本来想调用的是 a 函数，结果却调用了 b。

Matt 在文章里列举了几种 API 被污染的情况，最后还从调用方和声明方两个角度去探讨如何避免类似情况发生，值得一看。

### 🐎 [The perfect guide to AppStore search optimization (ASO)](http://blog.rootshell.ir/2019/02/the-perfect-guide-to-appstore-search-optimization-aso/)

本指南介绍了 App Store 产品页面每个基本信息的最佳实践，内容简明扼要，很有参考价值。相关阅读：[App Store Product Page](https://developer.apple.com/videos/play/insights/app-store-product-page/)

### 🐎 [Flutter 与 iOS 原生 WebView 对比](https://juejin.im/post/5c778d86e51d4506304ee348)

本文作者对比了 UIWebView、WKWebView、flutter_webview_plugin（在 iOS 中使用的是 WKWebView）的加载速度、内存占用、HTML5 兼容性。

### 🐕 [[译] 用这些 iOS 技巧让你的 APP 性能更佳](https://juejin.im/post/5c6a0b6ef265da2de660f83f)

本文介绍了 APP 性能优化的五种技巧：

1. 使用可复用的 tableViewCell
2. 使用看起来像应用首页的启动页
3. 视图控制器的状态恢复
4. 尽可能减少透明视图的使用
5. 在后台线程中处理繁重的功能

除了一些老生常谈的优化点之外，**视图控制器的状态恢复**这个点比例新颖，作者也着重讲解了其原理和使用方法。如果你的应用中尚未用到，不妨一试，应该可以明显提升内存经常吃紧的用户(😂)的使用体验。

### 🐢 [Frontend Workshop from HTML/CSS/JS to TypeScript/React/Redux](https://github.com/Microsoft/frontend-bootcamp)

微软出版的从 HTML / CSS / JS 到 TypeScript / React / Redux 的前端训练营，为期两天，第一天搭建环境、介绍 web 的基础知识：HTML，CSS 和 JavaScript，通过演示代码了解一些核心概念。第二天演示和练习结合在一起，深入更高级的主题，如 TypeScript、测试和状态管理。（TypeScript 是由微软开源的编程语言。它是 JavaScript 的一个严格超集，并添加了可选的静态类型和基于类的面向对象编程，设计目标是开发大型应用，然后转译成 JavaScript）。

## 工具

### [periphery](https://github.com/peripheryapp/periphery)

periphery 是一个用 Swift 语言编写的，专门用于扫描 Swift 工程无用代码的工具。它的工作原理是利用了 Swift 语法树的各种回调特性，并且因为是 Swift 语言编写的关系，所以它也只能用于 Swift 工程。从本质上来说，它跟 OC 时代的各种`Clang Checker`做的事情是没有多大区别的，不过从代码的维护性上来说就比 C++ 版本的 checker 要好很多。实测下来，跑一次全规则扫描的时间确实挺长的，如果只是扫描无用的函数参数的话倒是非常的快，大概 10 来秒就出结果了。这个工具也提供了 CI 的集成方案，总体而言算是一个比较成熟的工具了，值得推荐。

## 代码

### 🌟 [chameleon](https://github.com/didi/chameleon)

chameleon 是来自滴滴出行的一套前端跨端整体解决方案。其最大特点是目标让一套代码，同时解决微信小程序，支付宝小程序，百度小程序，快应用，CML-SDK 终端等以 MVVM 为标准的终端。

目前国内前端大环境下，开发者需要为同样的功能在各自为阵的小程序，快应用上多次重复实现。这样做既耗时，也耗费大量的人力，最后的效果也不一定理想，所以这样一套统一多端的方案来避免多次重复开发，也不失为一个好选择。

吐槽一下，chameleon 这个名字已经被很多库用了，算是个非常常见的项目名字，如果能有个更独特一点的名字，可能会更好一点。

### [freeCodeCamp](https://github.com/freeCodeCamp/freeCodeCamp) 

开源代码库和课程大纲，和数百万人一起免费学习编程。freeCodeCamp 由一个小型非盈利组织运营，目标是帮助数百万繁忙的成年人向科技行业转型，这个社区已经帮助超过 10000 人找到他们的第一份程序员工作。其中全栈 web 开发课程是完全免费的，可以按照自己的节奏来学习，有上千个互动性的编程挑战来帮助你学习。

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

**如果你最近正在找工作，不放看看下面这篇文章：**

### 🐕 [iOS 开发者如何在互联网寒冬中杀出重围(付费内容)](https://xiaozhuanlan.com/topic/7609328541)

金三银四，又到跳槽时间点。该文章主要是整理了作者近段时间面试的一个心得体会，主要是讲述了面试前准备，简历书写，大厂面试经验，以及面试心态处理等几个方面。

## 关注我们

我们开通了公众号，每期发布时公众号（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)，[@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)，[@老峰](https://github.com/GesanTung)，[@zvving](https://github.com/zvving)，[@J_Knight_](https://github.com/knightsj)，[@AidenRao](https://weibo.com/AidenRao)

## 说明

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

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