# 老司机 iOS 周报 #68 | 2019-05-20

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

## 新闻

### 🌟 [SE-0260 Library Evolution for Stable ABIs](https://github.com/apple/swift-evolution/blob/master/proposals/0260-library-evolution.md)

[四娘](kemchenj.github.io)：目前 ABI 稳定的工作正在逐步收尾，Swift 5.0 达成的是标准库的 ABI 稳定。但这种 Module ABI 稳定的机制还没有提供给外部用户使用。

当前标准库是通过一些私有的注解和编译选项来使用这一套机制的，所以这次提案讨论的内容就是如何将它作为一个功能提供给我们使用，里面涉及的主要是一些语法和编译选项的设计。

需要跟 SDK 打交道的同学可以点击查看更具体的内容。

### [(SE-0253)Callable values of user-defined nominal types](https://github.com/apple/swift-evolution/blob/master/proposals/0253-callable.md)

Swift Evolution 最近通过的新的提案，（[SE-0253](https://github.com/apple/swift-evolution/blob/master/proposals/0253-callable.md)）为 Swift 带来了静态调用的 `Callable`。作为对比你可以看看在 Swift5.0 中就引入的（[SE-0216](https://github.com/apple/swift-evolution/blob/master/proposals/0216-dynamic-callable.md)）`@dynamicCallable`。或者，你也可以对比一下 Python 中的 `__call__`。

## 新手推荐

### 🌟 [FlutterDartTips](https://ibhavikmakwana.github.io/FlutterDartTips/)

[@olddonkey](https://github.com/olddonkey)：对于很多刚接触 Flutter 的同学来说，有一些 Dart 和 Flutter 编写中的一些小技巧可能并没有特别的熟悉。这些小知识点很多时候能让开发的时候，减少掉很多不必要的负担。

有一位来自印度的同学，就建了这样的一个项目，专门分享这些 Dart 和 Flutter 的小知识点。即便你已经对此很熟悉了，也不妨可以看看是不是有什么遗漏的点。

## 文章

### 🌟 🐎 [CocoaPods 1.7 新特性](https://kangzubin.com/cocoapods-1.7/)

[@J_Knight_](https://github.com/knightsj)：本文介绍了 CocoaPods 1.7.0 的几个新特性：

1. 支持多个 Swift 版本：可以在 podspec 配置文件中通过 swift_versions 字段指定其支持的 Swift 版本。也可以可通过 supports_swift_versions 字段为 Podfile 文件中集成的每个 target 指定所需的 Swift 版本。
2. 引入 App Specs：引入了 app apecs，允许 pod 库作者在其 podspec 中描述一个应用程序。
3. 生成多个 Xcodeproj：可以将每个 pod 库集成为其自己单独的 Xcode project，并嵌套在顶级 Pods.xcodeproj 下，这样显著提高大型 CocoaPods 项目的性能。
4. 增量安装：支持了仅重新生成自上次 install 以来发生更改的 pod 库，而不是像之前那样重新生成整个 workspace。
5. 新增 scheme 字段：可以为 specs，test specs 以及 app specs 自定义 scheme 的生成。
6. 支持 .xcfilelist：script phases 支持使用 .xcfilelist 来指定脚本的输入和输出路径。
7. 为 Master Specs Repo 提供 CDN 支持：启动了对 CDN 的支持，以避免在本地机器或 CI 系统上克隆 master specs repo，让使用 CocoaPods 更加方便。
8. 为 Windows 系统提供支持：添加了对 Windows 系统的支持。

### 🌟 🐎 [Image Resizing Techniques](https://nshipster.com/image-resizing/)

[@邦Ben](https://weibo.com/linwenbang)：Mattt 大佬说：大量的调整图片的代码都宣称自己是最正确的。因此，Mattt 给出 5 种不同的技巧以供选择。什么情况我们需要缩小调整图片尺寸？当图片尺寸远大于需求的时候，缩小可以节省内存提高性能。

- Drawing to a UIGraphicsImageRenderer (UIKit)
- Drawing to a Core Graphics Context (Core Graphics)
- Creating a Thumbnail with Image I/O (Image I/O)
- Lanczos Resampling with Core Image (Core Image)
- Image Scaling with vImage (vImage)

最后通过性能对比，前三种方法性能较好。如非必要，不使用后两种。
各个方法的示例代码，请阅读原文。

### 🚧 🐎 [A Deep Dive Into Hero Widgets in Flutter](https://medium.com/flutter-community/a-deep-dive-into-hero-widgets-in-flutter-d34f441eb026)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：对于 Hero 动画想必做移动开发的同学都不陌生，通常在 Native 开发情况下想要实现这个动画并不容易，但是在 Flutter 中内部就实现了这一交互效果，只需简单的使用 Hero 这个 Widget 即可，本文详细的讲解了 Hero 的基本使用和定制化开发。

### 🐢 [基于协程的编程方式在移动端研发的思考及最佳实践](https://mp.weixin.qq.com/s/DXj0-6YOwRcwQfsqB6CTTw)

从超级 App 的性能和代码痛点从发，道出 iOS 异步编程现状存在的缺陷，想必读者也感同身受。

- 多线程访问引发野指针问题
- 多线程访问引发容器类崩溃问题
- 多线程访问引发过渡释放问题

从而引出协程，基于协程的全新的异步编程方式，是我们解决现有异步编程问题的有效的方式。想要了解协程的最佳实践，读者们可以仔细阅读本文。

### 🐢 [Xcode Build Configuration Files](https://nshipster.com/xcconfig/)

在 Xcode 中可以设置我们项目相关各种工程设定，但是把所有的编译配置都在 Xcode 中设置有时候并不是一个明智的选择，光 Build Settings 选项里面就有上百项的设置选项，这并不利于我们维护。但好在苹果给了我们另外一种方式，使用 xcconfig 文件。它是用来保存配置键值对的纯文本文件，这使得我们可以分离代码和配置，如果你也有为工程配置烦恼过，不妨尝试试用一下 xcconfig 文件。

推荐阅读：
- [CocoaPods 1.7.0 Beta!](http://blog.cocoapods.org/CocoaPods-1.7.0-beta/)


### 🐎 [在闲鱼，我们如何用 Dart 做高效后端开发？](https://mp.weixin.qq.com/s/jAD3hacFMVcOv9GnAfCFOw)
[@xiaofei86](https://weibo.com/xuyafei86)：Dart 是一门简洁、容易上手、对异步支持良好的编程语言，在 Flutter 的开发中大放异彩。本文简单讲解了闲鱼使用 Dart 进行后端开发的实践经验。在闲鱼团队的努力下，Dart 用于后端开发的支持逐渐完善，前台和后端开发人员已经能够快速高效地使用 Dart 开发胶水层接口。未来闲鱼团队会着力于进一步改善 Dart 开发体验、与 Java 项目的兼容性、提升 Dart 远程服务的性能，挖掘 Dart 在后端开发中更大的潜力。

### 🐢 [What to Expect From Marzipan](https://blog.iconfactory.com/2019/05/what-to-expect-from-marzipan/?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=web&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B403)

> Marzipan 是 Apple 内部项目代号，Apple 在 WWDC 2018 发布了一项计划：将 UIKit App 迁移到  macOS 上。

[@享耳先森](https://github.com/iblacksun)：WWDC 2019 不久就要开始，预计 Marzipan 计划将有新的进展，但作者认为平台迁移没有想象中那么美好，不是光适配代码发布就完事了，作者从开发、设计及市场三个方面分析迁移可能会面对的难题。

## 工具

### [Run Swift in browsers](https://swiftwasm.org/)

[@AidenRao](https://weibo.com/AidenRao)：将 Swift 代码编译为 [WebAssembly](http://webassembly.org.cn/) ，使它能在浏览器上直接运行。目前还是第一个版本，Swift 的很多功能还需要支持，感兴趣的同学可以加入 [swiftwasm](https://github.com/swiftwasm)。

## 代码

### 🌟 [Mango](https://github.com/YPLiang19/Mango)

[@looping](https://github.com/looping)：MangoFix 是一个 iOS 热修复 SDK，不同与 JSPatch，它内置了一个语法和 Objective-C 非常类似的 DSL 和对应的解析器。它的设计目标是为了解决 iOS 热修复问题，所以在使用的便捷程度和性能方面都有很大优势。对 iOS 热修复或者制作 DSL 感兴趣的同学可以参考作者写的 [《MangoFix：iOS 热修复另辟蹊径》](https://www.jianshu.com/p/7ae91a2daead) 和 [《iOS 热修复 MangoFix 原理分析》](https://www.jianshu.com/p/a6511c687eda) 这两篇文章深入了解下。

### [ui-fabric-ios](https://github.com/OfficeDev/ui-fabric-ios?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=web&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B403#colors-and-typography)

`ui-fabric-ios` 是微软开源的一个界面框架，可为 iOS 平台提供 Office UI 体验。它包含有关颜色和排版的信息，以及平台控件的自定义，所有这些都来自 Office 和 Office 365 产品中使用的官方 Fluent 设计语言。感兴趣的同学可以下载下来深入研究。

### [mathAI](https://github.com/Roujack/mathAI)
[@莲叔](http://weibo.com/aaaron7)：拍照做题在生活大爆炸中第一次出现后，就引起了不少关注，这个极具未来感的应用场景随着计算机视觉技术的发展已经逐渐走近现实，该作者基于 py 实现了一套拍照做题的系统，并在仓库中附带了一份 ppt 来介绍自己的防范，大概就是首先通过 opencv 进行字符预处理，然后用 cnn 来识别手写的字符已经数学符号，并根据空间信息来重建出手写公式的信息结构，最后一步通过编译原理中的表达式处理等方法来求解式子。作者部分开源了代码，但应该也能从中学到主要的流程，有兴趣的同学可以学习。

## 音视频

### [ggtalk | 聊聊跨平台：Weex 尚能饭否？](https://talk.swift.gg/30)
[@莲叔](http://weibo.com/aaaron7)：如标题所说，这一期的 ggtalk 讨论了 Weex 这个颇具争议的框架。节目中除了聊 Weex 本身的一些问题之外，还聊到了一些对 Weex 比较常见的误解。虽然 Weex 和 RN 经常被拿来做比较，但其实本身的定位却有区别，本质上是 for 不同目的的业务场景，比如 RN 比较完整的包装了系统的接口，目标是尽可能闭环在 RN 的环境中完成整个 app 的开发，而 weex 恰恰相反，其相对简洁的框架主要是服务于动态 UI 的实现，绝大多数逻辑部分还是依赖于 Native 实现，但也就因为这个特性，Weex 有非常简洁的和 native 进行 bridge 的框架方法。这类问题在节目中得到了充分的讨论，当然也包括其中的一些坑，有兴趣的同学可以看看。

## 内推

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