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

3,808 阅读7分钟

老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

🌟 🐢 Facebook 发布全新 JS 引擎!专注提高 React Native 应用的性能

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

文章

🌟 🐢 SwiftUI:苹果的一次天才尝试

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

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

关于响应式编程,周报编辑 JasonYu 曾写过 - 为什么需要 Reactive Programming? 一文,也很值得大家品味。

🐕 [译] 使用 Swift 5 构建 iOS 移动端群聊 App

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

🚧 PubNub:为移动终端和网络应用开发提供实时信息通讯服务,现已有 70 多个 SDK,可以支持各种 App 和服务集成进自己的网络,提供每个月一百万条免费的消息。

🐕 Building a Trello-like iOS App with Drag & Drop API

@张嘉夫: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

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

🐢 Swift5.0 的 Runtime 机制浅析

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

🐎 Better Storyboards with Xcode 11

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

🐎 如何写出让同事无法维护的代码?

@tom510230:本文举出了大量的例子,来阐述糟糕的代码长得什么样,有以下六个部分

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

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

工具

2019年最优秀的JIRA项目管理工具替代方案

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

SwiftUI-Cheat-Sheet

@水水:一个 SwiftUI 相关的一些 API 使用示例,当你使用 SwiftUI 时,可以快速获取到相关代码用于参考。

XCAssetsKit

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

代码

NSAttributedStringBuilder

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

Runtime

@四娘:一个基于 Metadata 的 Swift 运行时库,可以很方便地查看类型信息,并且动态地调用属性 getter 和 setter:

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 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:www.yuque.com/iosalliance…

如果你想招人,点这里:www.yuque.com/iosalliance…

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

关注我们

我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。

同时也支持了 RSS 订阅:github.com/SwiftOldDri…

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)