阅读 3219

老司机 iOS 周报 #42 | 2018-11-05

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

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

小专栏

北美软件工程师面试简单介绍

好多同学都比较好奇北美的软件工程的面试和国内的有什么不同,具体情况又是如何的,这篇小专栏就简单的给大家介绍了一下北美的 Software Engineer 的面试情况,有兴趣的不妨读一读了解一下。

新闻

App Store Connect API Now Available

WWDC 2018 中苹果提及了 App Store Connect 将迎来一次比较大的更新,其中有两个内容比较受国内开发者关注 - TestFlight Public Links 和 App Store Connect API。前者已经在前一段时间发布了,而后者这周也正式发布。

相关功能介绍可以在 What’s New in App Store ConnectAutomating App Store Connect 中进一步了解。

文章

🌟 🐕 支付宝客户端架构解析:iOS 容器化框架初探

你是否好奇一款航母级 App 他的内部客户端架构是怎样实现的?到底什么样的架构设计才能满足几十上百人共同开发迭代一款 App ?这篇文章会带大家深入到支付宝的 mPaaS 框架之中,了解一下支付宝客户端业务容器化的实践 -- 将业务隔离成相对独立的模块,而整个框架作为容器管理着众多子业务子模块,并着力追求模块与模块之间高内聚、低耦合,灵活的插件式开发。

mPaaS iOS 框架源自于支付宝客户端,为了实现这种上千个工程之间的低耦合和相关依赖调用,mPaaS 框架直接接管了 App 的生命周期,负责整个 App 启动托管、App 生命周期管理、处理与分发 UIApplication 的代理事件。mPaaS 框架提供了容器化环境,业务开发人员在这个容器化环境中使用 微应用微服务 进行具体的业务需求开发。

🌟 🐎 The power of key paths in Swift

由于 Swift 是一门追求编译时安全和静态类型的语言,它缺少其它更注重运行时的语言(Objective-C、Ruby 和 JavaScript 等)所拥有的动态特征。例如在 Objective-C 里,我们可以在运行时动态访问对象的任意方法和属性,甚至可以替换其实现。虽然动态性的缺失是 Swift 的一大优势之一,有助于写出容易预测、正确率更高的代码,但在某些时候,如果能用更动态的方式来使用代码,会很有帮助。幸运的是,Swift 正在不断推出更多更动态的功能,同时仍然保持类型安全的原则,key path 就是其中之一。在这篇文章里,会为你展示 key path 在 Swift 中的使用方式,以及利用它实现的一些强大功能。此外,还可以参考这篇文章 Swift Tip: Auto Layout with Key Paths

🌟 🐢 Protocol Oriented Programming(POP) in Swift: Is it better than Object Oriented Programming(OPP)?

自从 Swift 2.0 引入面向协议编程(POP)这一概念以来,已经有成百上千篇关于这一概念的讨论文章,本次作者以专注编码 30 年老司机的身份,在实际开发中大量运用 POP 模式之后,写出了他心目中的 POP。本文将由以下几点展开讨论:

  • 为什么 Swift 被认为是一门面向协议的语言;
  • 比较 POP 与 OOP 的异同,指出他们主要区别在于能否实现多继承;
  • 对比值语义与引用语义的区别;
  • 分析了苹果在 WWDC 2016 提出的 “局部推断(Local reasoning)”;
  • 举了 Protocol 的几个使用场景:如实现委托模式、作为类型和实现多态;
  • Review 作者在 Swift 项目中的实践代码;

至于作者对 POP 最终的态度,点进来看看吧,另外有兴趣的话不妨看看作者的前一篇关于 POP 的入门文章

🐕 React Native 重构路线图发布!

Facebook 6月中旬发布了他们即将“大规模重构 RN” 的消息,时隔四个月,近期终于公布了他们的一些计划细节,不过大部分都是工具链,流程上的增强。颇有一种裤子都脱了就给我看这个的感觉,不知道是不是对“大规模重构”有什么误解。这些增强虽然普通开发者可能感触不深,但对于一个团队做技术选型时候肯定是有帮助的,但是不是真能抵挡住 Flutter 的冲击呢?我表示不乐观。

🐎 Speeding Up Custom Script Phases

文章主要介绍了三种方案来加速 Xcode 自定义脚本的执行。

  • 第一种:勾选配置项中的 when installing,标识 APP 只在 Archive 模式下才执行脚本。
  • 第二种:添加你自己的逻辑代码来标识脚本的执行程度。
  • 第三种:利用两个可选项 Input Files 和 Output Files,这两个列表中填写为文件路径或文件夹路径,它们就是 Xcode 来判断脚本是否需要执行的依据。

对于最后一种方案,文中表达不是很明确,我花了点时间做了一个实践,最后归结如下,Xcode 会重新执行脚本的条件如下:1. 两者中任一文件修改。 2:两者中任一文件夹内有文件添加/删除/替换

在 Xcode 10 之后脚本增加为4个可选项,除上面表述的两个外,还有 Input File List 和 Output File List。如有兴趣可以参考 [New Feature] Generate xcfilelist for Script Build Phases 文中对于 File List 的看法。

🐎 Running Other Apps' Siri Shortcuts Through Deep Links in Swift

文中作者展示了使用 Deep Link 来打开捷径的案例。通过 shortcuts// 这个 URL Scheme 来跳转捷径应用。若 URL 中的 Path 为 run-shortcut 则可以去执行捷径,当然我们可以通过参数 name 来指定执行对应的捷径,input 参数来为你的捷径增加入参,x-success/x-cancel/x-error 参数来为你的捷径提供执行状态的回调处理。此外,作者还介绍了具有导入功能的捷径 URL 和 一些捷径 APP 的配置页面。

🐕 Let's Set Up Your iOS Environments

本文介绍了一些对于新手来说非常实用的 Xcode Project 设置的小知识:使用 .xcconfig 文件来合理设置工程。这东西可能在工程体量还不是很大的时候,显得不是那么的重要,但是当工程逐渐变大,结构也变的越来越复杂的时候,有一个清晰合理的结构,容易配置的工程对整个团队来说都是一个福音。

🐕 Text Kit Tutorial: Getting Started

TextKit 是 iOS 7 开始推出的图文混排框架,其基于底层的 CoreTextUIKit 中的 UILabelUITextViewUITextField 都构建在 TextKit 之上。本文介绍介绍了两部分内容:如何适配 Dynamic Type 特性;如何实现图文混排及文字环绕图片布局。

🐕 【基本功】深入剖析Swift性能优化

这篇文章的核心内容出自 Understanding Swift Performance,主要讲了 Swift 的一些优势以及苹果做了哪些方面的优化。所以推荐每个 Swift 的开发者都要仔细看一下这个 Session 的内容。

当然,因为 Swift 在不断的优化,视频内容的部分东西已经有点点过时了。我稍微补充一下:

  • Existential Container 目前虽然是用 3 个 word 存储数据,但是在 ABI 稳定之前,这个大小一直还没有确认。同时,文中所说的 Existential Container 是 5 个 word 也不太恰当,更合理的是大于 4 个 word。比如 Any 的 Existential Container 只有 4 个 word,而 Codeble 的 Existential Container 大小为 6 个 word。
  • 其次,对于 Indirect Storage With Copy-On-Write 的说法,在 Understanding Swift Performance 指的是 Swift 3 的时候,类似于 Array 这类基础库的大数 struct 如何解决 Copy 问题。而不是对于所有 struct 实现了这个 COW。但是 Swift 4 的时候,苹果改变了策略,在编译器这边做了一定的优化,实现了“自动”实现 COW。

🐕 One Quick Way to Drastically Reduce your iOS App’s Download Size

大家都知道,app 的下载体积越小,用户需要等待的时间就越短,尤其是对于用 Swift 开发的 app,体积动辄几十兆,令人头疼。本文作者分析了影响 app 体积的几个方面和一些优化的方法,包括 bitcode、使用 xcrun 命令分析各部分所占空间等等。

🐕 深入理解 Autolayout 与列表性能 -- 背锅的 Cassowary 和偷懒的 CPU

Autolayout 的性能一直为人所诟病,也是列表卡顿的原因之一。本文作者从 Autolayout 的算法角度进行分析,介绍了 Cassowary 的基本原理,并根据文字渲染结果做了一些详细的测试,判断性能问题是苹果实现不当所致,而不完全是算法的原因。最后也介绍了作者自己实现的 Panda 框架,基于 Autolayout 算法的概念进行优化,感兴趣的朋友可以试一下。

🐎 Class written in Swift

纯 Swift 类的函数调用跟 OC 中的运行时消息发送机制是不同的,是在编译阶段就确定了调用哪一个函数。虽然 Runtime 的接口可以使用,但是却并不能保证返回结果的正确性。作者在自己写的某个开源库上的一个 issue,由于和 Swift 类有关,研究了下 Swift 编写的类。对于在使用 Swfit 过程中,在 Debug 或者其他情况有疑问的同学,可以看一下本文的分析。

🐕 Specializing protocols in Swift

这周的 Swift by Sundell 介绍了一个很有趣的泛型功能 —— 泛型协议特例化。这是 Swift 4 时引入的功能,让我们在继承泛型协议的同时约束 associatedType 的类型,听起来很拗口难懂,目前在标准库里有一个非常标准的示例 SubSequence,大家一看就能理解:

protocol Sequence {
    associatedtype SubSequence : Sequence
    ...
}

protocol Collection: Sequence where SubSequence: Collection { ... }
复制代码

Collection 通过 where 从句对子序列的类型进行约束,让 Collection 的子序列必须也遵循 Collection(而不只是 Sequence)。

如果你觉得这个例子离业务太远的话,那就可以看看 Sundell 在文章里介绍的一些离业务更近的用例。

工具

iOS Project Template

这是一个可进行代码签名、持续集成、项目分发的项目模版。它为新项目提供了一个起点,可以方便的进行项目构建。这个模版中提供了一个 Core 框架,要想用于自己的项目,还需要修改一些文件的某些配置和内容。感兴趣的朋友可以试试看,或许它能够帮到你。

Eliminate Unused Swift Code

这是一个可以移除 Swift 项目中所有没用到的代码的工具,帮助你把项目变得更加干净。注意目前版本的 CocoaPods(1.5.3) 会导致它不能正常工作,升级到 1.6.0.beta.2 即可。这个工具免费即可使用,但是充钱可以变得更强。

代码

CodyFire

CodyFire 是基于 Alamofire 的 Codable 协议 API 请求管理库,使你庞大的网络请求代码,变的更简洁,易于维护。Swift 由于类型安全的特性,对于像 JSON 这类弱类型的数据处理一直是一个比较头疼的问题。Swift 4 中新增的 Codable 协议解决了字典与模型之间转换的问题,Codable 协议也让 API controller 的构建代码变的十分优雅。 CodyFire 能自动根据所运用的环境,切换 baseURL,能方便的添加公共头、对异常状态统一处理、对请求进行取消、设置超时,或者预防请求返回过快,添加交互式延时(不用再担心,网络太快,等待动画没有很好的执行。小编和 CodyFire 作者都非常喜欢这个功能)。还能串行或并行,使用链式调用进行多个请求,并对结果进行统一处理。

内推

关注我们

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

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

本期编辑

@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驴@小非86@红纸@含笑饮砒霜@JimQ

说明

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

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

关注下面的标签,发现更多相似文章
评论