Releases: SwiftOldDriver/iOS-Weekly
老司机 iOS 周报 #8 | 2018-02-26
新的一年,欢迎第十位编辑 @Parsifal 的加入。
新闻
App Store 描述截图从 5 张增加到 10 张
苹果再次对 App Store 更新了上架规则,新的规则宣布,开发者对于其开发的 App,在截图介绍部分可以添加 10 张屏幕截图,而之前是 5 张。
四月起,所有提交审核的 APP 都要基于 iOS 11 的 SDK 开发
苹果发出最新通知,从 2018 年 4 月开始,所有提交审核的 APP 都要基于 iOS 11 的 SDK 开发,且支持 iPhoneX 的 Super Retina 显示屏。
这也意味着,开发者至少需要使用 Xcode 9 来开发 App ,并确保他们的 APP,在 iPhoneX 上根据安全区域进行了适配。
文章
🌟 探索 iOS 内存分配
介绍了 iOS(OS X)系统中 VM 的相关原理,以及如何使用 VM Track 模板来分析 VM Regions,通过深入了解 iOS 的内存分配,可以有针对性的对内存进行优化。
🌟 移动场景下通信协议 FlatBuffers、ProtocolBuffers、MessagePack 选优
JSON 有可读性高、易于使用的优点。但是也有解析费时、解析内存耗费高、及数据量大的缺点。除了 JSON,现在主流的还有 MessagePack、FlatBuffer、ProtocolBuffers 通信协议。文章综合不同场景对比了这几种通信协议的优劣。
Just Controllers
iOS 上的 MVC 模式最后会导致 VC 中有大量代码在业界已经达成了共识。优化的一种方式是把 VC 中的代码拆分到 child view controller。实践中你会发现 child view controller 的使用起来并不像 UIView 一样简单,要注意它和 parent view controller 的生命周期控制。View controller 中的 view 使用起来和一个单纯的 UIView 实例也有不同。有的场景自定义一个 controller 类包含 UIView 也许会是一个更好的主意。
UIVisualEffectView Tutorial: Getting Started
利用 UIKit 中提供的 UIVisualEffectView 来实现常见的模糊背景的效果简单又好用。文章介绍了模糊的算法原理和 UIVisualEffectView 的使用方式。
Unit testing asynchronous Swift code
介绍了单元测试中处理异步代码的几个小技巧:通过设置 XCTestExpectation
的 inverted
属性来验证任务是否完成;将异步闭包添加到同步线程中,接着在同步线程中执行一个空的闭包来判断异步操作是否执行完成;在代码中通过 mock 将异步的操作封装为同步的操作方式来避免处理异步的情况。
🚧 iOS Developer Roadmap
国外开发者维护的 iOS 开发技能导图,作者将 iOS 开发中所涉及到的技能总结为一个个 topic,并提供对应 topic 的学习资源。无论你是还未入门的小白,还是想继续提升的开发者,亦或是正在准备面试的求职者,都可以利用这份图谱进行知识学习和梳理。
iOS IP 直连原理剖析
移动互联网的网络状况十分复杂,三大运营商、3G、4G、Wi-Fi、地点等任何一个状态的改变都会导致网络状况的变化,IP 直连可以跨过运营商 LocalDNS 服务器解析过程,从而达到降低延迟、避免劫持的效果。本文对 iOS IP 直连原理进行了剖析,高度概括,通俗易懂,值得一看。
iOS Code Signing Tutorial Series
由 Shashikant Jagtap 发布的 iOS Code Signing 相关系列博客,总共五篇。众所周知,iOS Code Signing 对于大部分 iOS 开发者来说,一直都是最神秘的存在,尽管有所谓的官方文档。显然作者也发现了这个问题,所以他采用了亲身实践的方式,力求更简单的为读者解读 iOS Code Signing 的一些细节,小编大体看了下,确实通俗易懂很多。(PS:有在做技术文章翻译的童鞋可以考虑把这个系列翻译成中文,造福更多开发者~)
我是怎么慢慢变懒的(2) : Jenkins 全自动化
作者根据自己的实际项目经验,写了一篇总结。大概讲了「我搭建了一个怎么样的 Jenkins 环境」以及在搭建过程中遇到了哪些问题。
工具
Snipaste for Mac 公测版推出
具体介绍可以看少数派的文章:Snipaste for Mac 公测版推出,改变你在 Mac 上的截图体验。
代码
ZHStatusVolume
设置音量时隐藏系统的 hud,将音量变化展示在状态栏上。用 OC 写的,兼容 Swift,刚刚发布第一个版本,如果使用中有问题欢迎联系我@没故事的卓同学。
ReactiveLists
ReactiveLists 基于 React 编程思想,封装 UITableView 和 UICollectionView 的 API,使用该 API 可以编写 无状态函数 来生成列表页面。作者认为,在向 UIKit 组件提供数据上,这些无状态函数相比 DataSource,Delegate 更易于阅读和迭代,而且还易于测试。
作者关于 ReactiveLists 的介绍:Open Sourcing ReactiveLists for iOS
Uber 的 App 开发架构 RIBs
Uber 的跨平台开发框架 RIBs,架构名由 Router
, Interactor
和 Builder
的首字母组合而成,表示了该架构的构成。优势如下:
- 在 iOS 和 Android 间共享同一套架构;
- 可测性和隔离性,便于进行单元测试同时各个独立的 RIB 类间高度解耦;
- 提供代码生成、内存泄漏检测、静态分析和运行时集成等一系列开发工具;
- 一种可伸缩的架构,已被证明可适用于几千人基于统一代码库开发的场景。
一种适合响应式编程和大项目的架构,对架构有兴趣的同学一定不要错过。
SwifterSwift
SwifterSwift 是一个用 Swift 编写的 Extension 的集合,涵盖了开发过程中大部分会用到的方法和函数,是一个不错的工具库。同时 SwifterSwift 大概有 SwiftStdlib Extensions、Foundation Extensions、UIKit Extensions、AppKit Extensions、CoreGraphics Extensions、CoreLocation Extensions、Misc. Extensions 等一系列分类。
音视频
🚧 🌟 Swift’s Reflective Underpinnings
Swift 核心开发团队成员在 Swift Summit 上的演讲视频。介绍了 Swift 的动态能力的构建基础,提及了未来 Swift 版本中可能引入的动态特性。其实在 Swift 中已经有一些反射的能力,每个类型在内部都有 metadata ,可以查到这个类型的字段、方法,只是没有暴露出来。强烈推荐 Swift 爱好者观看,干货很多。
另外 Swift Summit 的其他视频也都分享在了 Skilled 网站上,大家可以关注一下。
本期编辑
@没故事的卓同学,@mmoaay,@EyreFree,@Damonwong,@张嘉夫,@AidenRao,@Parsifal
说明
🚧 表示需翻墙,🌟 表示店长推荐
老司机 iOS 周报 #7 | 2018-02-12
这周就是春节了,周报在春节期间不会更新,祝大家过个好年。
新闻
Swift 4.1 新增 -Osize
优化模式降低代码尺寸
Swift 4.1 将随 iOS 11.3、Xcode 9.3 一起发布。Optimization Level
新增 -Osize
模式,降低编译后代码尺寸。按官方描述,启用 -Osize
后代码尺寸将降低 5%-30%,而性能影响可以忽略不计(小于 5%)。
另外,还从 Optimization Level
独立出 Compilation Mode
,可选 Single File
和 Whole Module
。
iOS 关键组件 iBoot
源代码泄露
有匿名开发者在 GitHub 上传了 iOS 核心组件
iBoot
的源代码,iBoot
是 iOS 关键的源代码之一,它确保了操作系统的可信任启动,换句话说,它是加载 iOS 的程序,是开启 iPhone 运行的第一个进程,它加载并验证内核是否被苹果正确签名,然后执行,就像 iPhone 的 BIOS 一样。
Apple 已确认这一事件并表示泄漏的是 iOS 9 的代码。
苹果公司与内蒙古签订协议,将在中国国内建设第二个数据中心
苹果公司将在内蒙古乌兰察布市,建设中国第二个数据中心,于 2020 年开始投入运营,继而形成“南贵北乌”两个数据中心的格局。
文章
iOS KVO crash 自修复技术实现与原理解析
一年前网易杭研的博客《大白健康系统--iOS APP 运行时 Crash 自动修复系统》引发了很多讨论。利用 runtime 动态特性,对一些常见 crash 进行保护:
- unrecognized selector crash
- KVO crash
- NSNotification crash
- NSTimer crash
- Container crash(数组越界,插 nil 等)
- NSString crash (字符串操作的 crash)
- Bad Access crash (野指针)
博客介绍了实现原理,未公布代码。现在根据小道消息,网易的这个库内部并未全面使用,开源计划已经搁置。社区有热心群众出于学习心态,按照文章思路写了一个类似的代码库:BayMaxProtector 。
本文则针对如何防护 KVO crash 提出新的方案:通过建立哈希表保存观察者、keyPath 的信息,在对象 dealloc 时进行状态的更新。
[译] Swift 算法学院 - 查找数组中第 K 大值
介绍了查找数组中第 K 大值的算法。更多的基于 Swift 的算法例子可以看 raywenderlich/swift-algorithm-club。
数据结构 & 算法 in Swift (二):算法概述和排序算法
本篇是《数据结构 & 算法 in Swift》系列连载的第二篇,首先简单地讲解了算法基础,包括算法的概念、时间复杂度与空间复杂度以及递归。然后结合 Swift 代码实现讲解了排序算法,包括选择排序、插入排序、归并排序和快速排序。
iOS 架构之 View 层的架构方案
在前两年 Casa 分享的 iOS 应用架构谈 view 层的组织和调用方案 之后,这是圈内现在新鲜出炉的又一篇 view 层架构分析文章。Casa 的文章最后站在更宏观的角度去提出 view 层架构模式需要遵循的"拆分三大心法"和"设计四大心法"。
这篇篇幅相对要少一些,该作者从「如何评价一个架构方案」-> 「MVC / MVVM / MVP / VIPER 等几种主流的架构模式简析」-> 「团队内最终的方案」,循序渐进地分享了适合自己团队的架构方案实践过程,对于初入架构设计的同学会相对更加友好一些。笔者建议先读懂这篇文章后,再细细咀嚼 Casa 的文章。
Crash 符号化
作者一共写了三篇文章,从 基本流程与相关命令 到 symbolicatecrash 源码浅析与优化 以及最后的 Mach-O 与 atos,由浅入深的解释了 iOS Crash 从产生到符号化的整个过程。
Swift 中关于操作符的那些事儿
这篇文章主要是介绍了一个处理 Error 的技巧,通过自定义操作符来简化错误处理的代码,没有复杂的逻辑和抽象,简单实用,强烈推荐👍
WebAssembly 能干什么?8 个 WebAssembly 应用案例
WebAssembly 的特点是在浏览器里面他运行的比 js 快,虽然还是一个提案中的技术,但是各大浏览器厂商都已经跟进,因此有了很多 WebAssembly 实际应用案例,这篇文章就介绍了 8 个案例,从这里面的介绍可以看到 WebAssembly 普遍被应用到了这几个方向
- 将其他语言编译成 WebAssembly 做到可以在浏览器里运行;
- WebAssembly 在游戏引擎与图形渲染方面的运用;
- 是加速原本的 js 代码的运行。
[译]在 Git 中保护 iOS 项目的敏感信息
如果要开源的代码涉及敏感信息,比如 API Key,HMAC secrets 或密码,那么比较好的方式是把它们放在新建的 xcconfig 文件里,Git 再忽略这些文件。
最后新建不把值包含进去的示例配置 xcconfig 文件。
其它开发者此时只需要将示例配置文件填值,再重命名一下即可轻松运行不包含敏感信息的项目。
Swift 4.1 improves Codable with keyDecodingStrategy
Swift 4.0 中增加了 Codable
来方便的解析 Json,然而 Json 作为一个通用的数据格式通常用于和其他平台交互,其他平台的命名规范如果不是驼峰式就需要声明 json key 映射。4.1 中增加了 keyEncodingStrategy
配置两种常见命名规范的自动转换:
let jsonString = """
[{
"name": "MacBook Pro",
"screen_size": 15,
"cpu_count": 4
}]
"""
struct Mac: Codable {
var name: String
var screenSize: Int
var cpuCount: Int
}
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let encoded = try encoder.encode(macs)
Parallel programming with Swift 1. Basics 2. Operation
第一篇介绍了使用 Swift 进行并行编程时的多种方式,从 Process 到更高级的抽象 Operation,如何控制并发的顺序,锁和信号的使用。
第二篇主要是讲 Operation,包括 API,生命周期,依赖以及封装的介绍。
这一系列由浅入深,配图清晰,顺便推荐一下他们团队 Flawless 的博客,里面有很多技术分享,质量都很高。
漫画:Git 二分 Debug,火速定位出错代码!
详细介绍了 Git 提供的二分法调试工具:git bisect。它可以按照我们选定的 commit 列表,进行二分分割,快速定位出出错的 commit。来帮我们缩小最小改动的代码,从而快速定位问题。作者还采用了漫画的形式,帮助读者加深印象。
工具
PodsUpdater--A macOS app which helps you manage dependency releases in your Podfile
一款协助你管理项目中 CocoaPods 依赖的小工具,能够清晰展示你项目内的依赖版本以及该依赖的最新版本,并提供自动适配兼容版本的功能。
分享笔者在使用过程中遇到一个坑,原因是某个比较旧的私有源配置的是 http 的 url,导致出现了fatal: could not read Username for 'http://git.privatesource.com': Device not configured
,即该工具执行 pod repo update
的时候并没有权限去拉取你的私有源。解决方式也很简单,把旧的源里 url 修改成 ssh 的 url 即可,配置文件路径为 /Users/your_username/.cocoapods/repos/-private-podrepo/.git/config
CoreML 模型仓库
iOS11 所推出的 CoreML 让 App 开发者可以不用学习了解 Deep Learning ,不用亲自训练模型,拿训练好的模型就可以在 App 里快速使用。并且搭配开放了几个视频识别物体的模型 Object Detect,那么除了苹果开放的识别物体模型,现在还有哪些地方可以找到更多的训练好的 CoreML 模型呢?这里面介绍 3 个 Link,里面有很多训练好的有趣的模型,比如照片转油画 / 面部情绪识别 / 人物年龄猜测 / 文章分类 / 文字情绪识别等等,iOS 开发者的福音,可以拿来做一些有趣的个人 idea App
- https://coreml.store/
- https://github.com/likedan/Awesome-CoreML-Models
- https://github.com/SwiftBrain/awesome-CoreML-models
Carbon
Carbon 是一个可以在线将代码生成高逼格图片的工具,它具有以下特点:
- 可从 GitHub gist 直接导入;
- 高度自定义,可调整语法主题、窗体样式等参数;
- 分享便捷,一键发布 / 保存图片。
GitHub 地址:https://github.com/dawnlabs/carbon
CTF Wiki
CTF(Capture The Flag,夺旗赛)起源于 1996 年 DEFCON 全球黑客大会,是网络安全技术人员之间的竞技比赛。
CTF Wiki 是一个自由的站点,主要包含了 CTF 中的基础知识、常见题型、解题思路以及常用工具等,可以帮助你更快地了解 CTF 竞赛以及网络安全相关知识,对安全领域相关知识感兴趣的同学千万不要错过。
GitHub 地址:https://github.com/ctf-wiki/ctf-wiki
本期编辑
@没故事的卓同学,@四娘,@mmoaay,@享耳先森,@EyreFree,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao,@Parsifal
说明
🚧 表示需翻墙
老司机 iOS 周报 #6 | 2018-02-05
老司机 iOS 周报,只为你呈现有价值的信息。
新闻
从 iOS 11.3 开始 App Store 的评价终于可以排序了
从 iOS 11.3 开始,用户可以根据四个分类来给 App Store 评价排序,分别是“最有帮助”、“最高评价”、“最低评价”和“最新发表”。由于 iOS 11 之前的版本没法给 App Store 评价排序,所以这个改动会很受欢迎,特别是考虑到目前 App Store 会给一部分用户显示最早来自 2008 年的过时的、不相关的评价。
Apple Reports First Quarter Results
苹果公司发布 2018 财年第一季度财报,财报显示,苹果第一财季营收 883 亿美元,较上年同期的 784 亿美元增长 13%,净利润为 201 亿美元,较上年同期的 179 亿美元增长 12%。
相比 2017 年,iPhone 的销量从 7829 万,下降至 7732 万。但平均销售价格从 695 美元增至 796 美元,营收 615 亿美元,较上年同期的 544 亿美元增长 13%。
Apple 宣布因信号问题召回部分 iPhone 7
Apple 已经确认,由于主板上的某个组件发生故障,一小部分 iPhone 7 可能会在状态栏中显示「无服务」。这些受影响的设备生产日期在 2016 年 9 月至 2018 年 2 月之间,售出地为中国内地、中国香港、日本、中国澳门和美国,Apple 将免费维修。
Transporter 支持上传 App 预览信息了
Apple 官方提供的分发工具 Transporter 现在支持上传 App 预览信息了,具体细节请参考 Transporter 用户指南 和 App 元数据规范,注意这两个文档都有中文版。
文章
数据结构 & 算法 in Swift (一):Swift基础和数据结构
学习通用性知识,突破技能瓶颈,@J_Knight_ 开始《数据结构与算法分析 -- Swift 语言描述》的连载.
此文作为开篇,将从 Swift 基础、数据结构开始。讲解一下后续连载中所涉及到的 Swift 语法知识,以及用 Swift 来实现几个简单的数据结构。
🚧 Learn iOS Programming from Top Swift Articles of 2017
MyBridge AI 从 15000 篇文章根据关键词 Swift 挑选出的最受欢迎的 45 篇文章。
Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?
Protocol Buffer 是由谷歌开发并开源。通过两端约定好报文格式,数据传输过程中直接编码成二进制包。因为数据不再自描述,所以数据就小了很多,因此传输效率比 XML、Json 都高很多。本文详细介绍了 Protocol Buffer 提高序列化性能采取的策略和编码规则。
Swift Tip: OpaquePointer vs. UnsafePointer
objc.io
新文章,介绍了为什么将 C 类型导入到 Swift 时有些指针是 OpaquePointer
,有些又是 UnsafePointer<struct_type>
。如果你在开发中 Swift 需要与 C 交互的话,建议结合 Unsafe Swift: Using Pointers And Interacting With C 一起看。
最近很火的 Safe Area 到底是什么
iOS 11 出来很久了,适配的文章也很多,第一眼看到的时候我会觉得这个时候来写已经挺晚了,但看完之后觉得总结得是最好的,配图跟代码示例都有,重点的地方有加粗展示出来,这篇绝对值得 Mark 下来。
Pragmatic iOS Development: In defence of MVC
社区里广为流传着MVC 意味着非常臃肿的视图控制器
,但其实这只是 5 年前 Twitter 上的一个玩笑。
在开发中,大量的元素都需要一个外部委托,如果它们都委托给视图控制器,控制器将迅速的膨胀起来。但我们可以尝试另一种做法,控制器将任务委托给单独的第三方对象,自身不包含任何业务逻辑,只负责根据数据提供 UI 逻辑交互。如此便能使控制器保持小巧灵活。
Writing declarative code using Result Extensions
给 Result 类型写 Extension 来编写声明式代码,创建高度灵活的代码和声明式 API,易于维护、阅读和测试。
Model-View-Controller without the Controller
觉得 MVC 不好用,想找点新思路?本文详细介绍了作者对传统 MVC 模式进行改造从而构建一种全新 ModelAdapter-ViewBinder (MAVB) 设计模式的历程,并提供了相应示例代码,对架构有兴趣的同学绝对不要错过。
Swift Algorithm Club: Hash Tables
英文的 swift 算法文章,介绍 Hash Table 的基本原理,A hash table is nothing more than an array,文章从数组出发,介绍哈希值算法,数组 Index 计算,处理 index 冲突,值检索等方面,从0用 swift 教你一步步实现一个 hash table
工具
Transformer:EASY iOS NSAttributedString!
一个在线的富文本编辑器,实时编辑富文本,然后转换生成 Swift 或 Objective-C 代码,目前支持 文字粗细
、划线样式
、文字大小
、前景色/背景色
、文字对齐
等功能,方便好用。
SwiftAI - Generate Model class from JSON
一个 Xcode 插件(也有独立 App),可将 JSON 转换成 Model,支持 Codable
和 HandyJSON
。
代码
谷歌开源了一个 Promise 框架
标准的 Promise 库,谷歌出品,质量肯定是有保证的,具有轻量,高性能,安全,测试完备的优点。核心是使用 Objective-C 编写的,Swift 的版本是在 Objective-C 的基础上封装了一层(需要注意的是 Swift 版本暂时还无法用 Cocoapods 集成)。
书
Swift Design Patterns
Hacking with Swift 刚刚发布的 Swift 设计模式书籍 -《Swift Design Patterns》。售价 40 刀,目前包含了 24 个常见的设计模式。附源码,而且会随着 Swift 版本的更新免费升级。属于最佳实践类型的书籍,价格在英文原版书籍中也不算贵,有钱的童鞋可以买了看看。
本期编辑
@没故事的卓同学,@四娘,@mmoaay,@享耳先森,@EyreFree,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao
说明
🚧 表示需翻墙
老司机 iOS 周报 #5 | 2018-01-29
欢迎 @张嘉夫,@AidenRao 一起参与日后周报的编辑工作。
新闻
iOS 11.3 要来了,这是 iOS 11 目前为止最大的一次更新
苹果近期发布了 11.3 的开发者预览版,也一起发布了 Xcode 9.3 Beta,预计在春季正式发布(3 月)。这是 iOS 11 目前为止最大的一次更新,主要增加了电池健康状况查看,ARKit 升级至 1.5 版本,Safari 支持 service worker,以及其他很多小改进。
iOS 11.2.5 推送,Homepod 开始预购
苹果公司正式推送了 iOS 11.2.5 正式版更新,该版本加入了对 HomePod 智能音箱的支持,让其可以通过Siri朗读新闻(仅限美国、英国和澳大利亚)。此次更新的版本依然以修复 Bug 和安全漏洞为主。
同时 HomePod 也公布了上市时间,宣布在 2 月 9 日发售,1 月 26 日开始预购,首发国家只有美国、英国、澳大利亚。今年春季在法国和德国推出。但何时登陆中国市场目前尚未得知。
Apple’s augmented reality tool kit can now detect walls and 2D images in beta
ARKit 发布了一个重要的小版本更新:支持了垂直面检测,可以检测墙壁;同时也改善了对不规则水平面的识别;整体的追踪速度和精确性都得到了提高;呈现给用户的视频流也从 720p 提升到了 1080p,让 AR 体验更加真实。此外还有一个不显眼、但很有想象空间的更新是基于计算机视觉的内置 2D 图像识别,能够识别墙上的海报或画作等,可以用于判断场景中的位置,增加 AR 体验的连续性。 这一系列更新给 ARKit 应用带来了更多的想象空间,虽然 ARKit 目前的表现有些言过于实,但随着 Apple 更多这样令人惊喜的迭代,相信 AR 应用真正改变人们生活的那一天终会到来。
Swift 官方论坛迁移完成啦!!!
这周 Swift 论坛终于完成了迁移,对于 Swift 开发或者是细节决策感兴趣的人,可以去看看之前那些功能的讨论,例如 Swift 4.1 里新引入的“旧“成员 compactMap,或者是新的几个提案。
漏洞预警 | iOS WebView 跨域访问漏洞
早先被证实发生在安卓上的 File 协议跨域访问漏洞被确认 iOS 也存在,allowFileAccessFromFileURLs
与 WebKitAllowUniversalAccessFromFileURLs
2 个开关控制用于允许 File://
协议打开本地页面时任意访问本地路径文件与其他网络资源,这两个开关在UIWebView默认为开启状态,因此存在漏洞问题,WKWebView 默认关闭,无风险,但自行打开 allowFileAccessFromFileURLs 的一样存在风险(很多加载离线网页的博客文章教人打开这开关),解决办法:迁移至 WKWebView 并且确保不自行打开开关。
小程序支持跳转 App 了
对于开发人员来说,相比新闻本身,更需要关注的是打开 App 以及 App 链接分享到微信打开小程序的代码怎么写?有兴趣或者已经有需求的童鞋可以参考这两个链接进行实践。
文章
YYCache 源码解析
YYCache 是知名的 key-value 线程安全、高性能缓存组件。@J_Knight_ 从使用方法、架构设计、代码讲解三个角度详细的分析了 YYCache 的实现。
函数式编程圣经
知名公众号“码农翻身”老刘继《面向对象圣经》之后的又一力作《函数式编程圣经》,在这篇文章里,神五天创造不变量、纯函数、递归、高阶函数,让上帝为你解释函数式编程发展的来龙去脉,以及为什么函数式世界的程序员每周能休息两天。
Weex + Ui - Weex Conf 2018
介绍了 weex 在飞猪的实践经验,在飞猪使用 weex 后:首屏可用时间降级 68、Bundle大小直接减少了 73%,由于体验变好变快、让我们页面转化率居然提升了 14.5%
。也分享了 Weex 页面在飞猪、手淘、支付宝进行多端投放的思路。
最后介绍了 weex 业务在阿里集团使用过程中产生 weex-ui 开源库的过程。
JS 在微信、微博、QQ、Safari 唤起 App 的解决方案
经过长时间的实验,总结微博、微信、QQ、Safari 在 iOS 及安卓平台,唤起 APP 成功及失败的解决方案。
实现用户点击 H5 页面的打开 App 或者下载按钮,如果用户已经安装了 App,则根据业务跳转到相应的 Native 页面,如果用户没有安装该应用,则跳转 AppStore 或者应用市场去下载 App。
2018 iOS 社招面试经验
Offer 收割机手拿阿里、滴滴、美团等六家 offer,来分享自己的复习资料、面试遇到的知识点、以及面试准备方式,并介绍面试的各公司的流程和风格,本文需要付费才能阅读完整文章。
面向对象的 JavaScript 编程:原理与实践
如果你是一个刚接触 JS 的其他语言开发者(比如作为一个客户端对现在的大前端方向有浓厚兴趣),看到 JS 的面向对象编程一定觉得诡异无比无法理解,那么看看这篇有助于帮你解惑。
实现一个 JavaScriptCore 的 debugger —— iOS 篇
这篇文章里教你如何在 iOS App 里亲自实现一个 JS 的 debugger,首先教你如何用 JavaScriptCore 的源码在项目中 build 起来,然后继承 JSC:Debugger 重新实现一个 MyDebugger,这样就可以自行定义 debug 能力了,可以在 debugger 触发的时候由 App 自行开发相关的功能,自己在 App 里写一个 devTool 也未尝不可。
🚧 Getting started with Bluetooth Low Energy on iOS
介绍了和蓝牙外设通讯需要了解的一些概念,并且用一个实例演示了如何使用 iOS 的 CoreBluetooth 框架进行开发。CoreBluetooth 的入门使用 Raywenderlich 上的 Core Bluetooth Tutorial for iOS: Heart Rate Monitor 介绍的也很清晰。
软件工程师需要了解的网络知识:从铜线到HTTP(一)—— 前言
这是一系列文章,其目标是让软件工程师了解网络各层的本质。系列文章从网线开始讲起,一路带你了解 以太网
、TCP/IP
和 HTTP/HTTPS
,建议精读。
Recreating the Apple Music Now Playing Transition
从零开始实现一个 Apple Music 的 Now Playing
动画,主要基于 StoryBoard
及 Auto Layout constraints Animating
。
Simplifying Swift framework development
介绍了两个简化 Swift Framework 开发的小技巧:
- 使用
@_exported
声明引用,从而不用在每个 Swift 文件中都进行声明,类似 Objective-C 中的 Prefix Header; - 通过
class
的方式生成Bundle
,并定义成 Constant,从而更方便地获取 Framework 中的资源文件。
How to create a complex loading animation in Swift
raywenderlich 的教程一直以通俗易懂闻名,这次推荐的是一篇一步一步教你实现复杂动画的教程,使用的核心技术点是 CAAnimationGroup
。如果你没有时间一步一步跟着实现,也可以通过这个地址直接下载,查看完整的 Demo 工程。
Creating Flows
流程是用户交互设计的一个重点,例如说注册,我们不会给用户展示一个长长的列表去填写信息,而是会切分成多个页面去让用户逐步完成。那么我们该如何使用代码去组织这样的流程呢?在这篇文章里作者就深入地探讨了如何使用低耦合的组件来完成这样一套流程。
中文文案排版指北
在我们的日常工作中,经常需要编写一些文案、材料、报告之类的文本,大家应该已经非常熟练了。不过,大家是否有认真考虑过自己的标点、空格等的使用是否妥当呢?这篇文章给大家进行了较详细的分析,希望大家阅读后结合自己的思考,统一中文文案、排版的相关用法,形成自己(或团队)的排版规范。
为什么要缓存 NSDateFormatter ?
创建一个 NSDateFormatter 对象并不像我们想象的那样轻巧,如果你需要频繁使用某个 formatter 的话,对它进行缓存可能是一种更高效的方式。本小结阐述了问题的原因和推荐的缓存方式,值得一看。
🚧 A better way to update UICollectionView data in Swift with diff framework
借助 Diff 算法,以更高效的方式去刷新 UICollectionView。文章简单的介绍了一下 DeepDiff 这个库的原理及如何通过两个数组的差异对一个 UICollectionView 进行局部刷新。
工具
WoodPecker
app 运行在真机时如何实时查看沙盒中的文件状态?@张小刚哟 开发的 WoodPecker 通过 app 创建和 mac 客户端 socket 连接来解决这个问题。除了进行基本的沙盒文件查看修改外,还可以自定义通信报文创建扩展插件,对于某些场景中调试非常实用。
目前缺点是提供的 framework 需要手动集成到应用中,还未支持 cocoapod 导入。售价 30 元,感兴趣的朋友可以体验一下。
Fastlane: Boarding
原来添加一个 testflight 测试用户需要登录到 ITC ,手动添加邮箱。使用 boarding 可以简化这一过程。
iOS 爆内存问题解决方案 - OOMDetector 组件
本文将介绍一款 iOS 爆内存分析利器,它可以以极其微小的代价让藏匿极深的爆内存罪魁祸首无处遁形 —— OOMDetector。OOMDetector 是手 Q 团队自研的 iOS 内存监控组件,腾讯内部目前已有多个 App 接入了 OOMDetector,它主要有以下两个功能:
- 爆内存堆栈统计:负责记录进程内存分配堆栈和内存块大小,在爆内存时 Dump 堆栈数据到磁盘;
- 内存泄漏检测:检测内存泄漏,目前支持 Malloc 内存块和 OC 对象的泄漏检测。
OOMDetector 可以快速帮助开发者发现和定位 App 爆内存问题和内存泄漏,组件目前已在 Github 开源,感兴趣的同学可以尝试使用。
代码
AppFolder
AppFolder 是一个轻量级框架,用于友好的展示 App 文件夹内的目录,而且是强类型的。系统目录如 “Caches” 和 “Application Support” 已经存在,开发者也可以用几行代码添加自己的目录。AppFolder 充分利用了 Swift 的继承优势,接口简洁而又美观。有了它,你再也不需要用到 NSSearchPathForDirectoriesInDomains,再也不会。
书
刷新:重新发现商业与未来
微软第三任 CEO Satya Nadella 写的书。书里介绍了他接任后对微软的改造,强调企业文化,重拾微软灵魂的过程。书中也介绍了微软业务转型过程中的一些决策过程,比如拥抱云计算、Office 在全平台的推广、Windows 10 的免费升级策略,收购 LinkedIn 等。最后一部分还谈了他对未来科技发展三个大方向的思考:虚拟现实、AI、量子计算。
音视频
比特币原理
视频通过一个虚构的例子,一步一步由浅入深地介绍比特币是什么,以及比特币的基本工作原理。
本期编辑
@没故事的卓同学,@四娘,@mmoaay,@享耳先森,@EyreFree,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao
说明
🚧 表示需翻墙
老司机 iOS 周报 #48 | 2018-12-17
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
福利
🌟 我们发福利啦~
周报已经快陪伴大家走过一年的时间,非常感谢各位朋友的支持和厚爱。为了在 2019 年能更好地为大家服务,我们举办了一个问卷调查活动。在 12 月 27 日,我们会在参与问卷的朋友中选取合适的几个人赠与学习大礼包和现金奖。至于奖品是什么,大家可以在这条微博中了解,转发还有额外的抽奖~我们渴望听到你们的声音!
新闻
Apple 的年度 app 精选又出炉了,为了介绍和表彰获选 app,这是 App Store 和 Apple 官方微信联合呈献的 2018 App Store 年度颁奖典礼,欢迎围观下载。
SwiftNIO 是一个跨平台、异步、事件驱动的网络应用框架,可用于快速开发和维护高性能的网络协议服务器和客户端。对比同样是 Swift 服务端的框架的 Vapor,已在今天 5 月发布的 Vapor 3 中全面使用了该框架。当然作为一个底层框架,你一般不会直接和它打交道。
文章
🌟 🐕 解密 Runloop
很显然,Runloop
是一个很熟悉的名词,熟悉到每次面试都会碰到有人问你,请说说你对 Runloop
的理解。Runloop
是开源的,因此本文作者通过精简后的源码示例来解释 Runloop
的基本执行顺序。
- 基本流程:循环执行(执行任务->通知外部->休眠)。
Runloop
依赖mach_msg
进行进程间通信,也就是消息接收发送。Runloop
里面会执行source0
(可调用CFRunLoopAddSource
创建),source1
(仅系统调用)。Runloop
会执行5类任务timer, mainQueue, source0, source1, block
。Runloop
通过注册observer
的方式来通知外部当前的任务执行状态,而5类任务中mainQueue,source1,block
不支持注册observer
,也就是你无法通过obsever
来得到准确的执行时间。Runloop
的Activity
也是通过observer
来通知外部当前处于哪个Activity
,当source0
被执行的情况下,kCFRunLoopBeforeWaiting
和kCFRunLoopAfterWaiting
会被跳过,意味着单纯通过对Activity
的回调进行分析业务代码的执行状态是不可靠的。Runloop mode
分为common mode
和private mode
,作者通过捕获mode
得到了很多陌生的private mode
,分别用来处理不同的场景,例如_kCFStreamBlockingOpenMode
用来调度网络任务。因此,NSTimer
在设置kCFRunLoopCommonModes
的时候,也有可能因为private mode
的调用从而导致延时。Runloop mode
可以中途切换,有以下几种切换位置:- sleep 之前
- 执行 mainqueue 任务前
- exit 之后
Runloop
的运用场景:- 执行自己的任务,如 timer
- 用于观测主线程的运行状态
延展阅读
🌟 🐢 一个 Demo 入门 Flutter
最近,已经有许多的公司开场尝试使用 Flutter 进行开发。就在前两天,Google 刚刚在北京举办了 Flutter Live 大会,可以说,Flutter 的生态已经越来越庞大。今年,如果对 Flutter 还是一无所知的话,是不是有点 out 了呢?没关系,这不,就有一篇教大家入门的文章。文章不仅讲了 Flutter 的基本结构,还用实际的代码编写了一个 Demo,想学 Flutter 的同学不妨跟着做一遍,相信比单单看文章更有效果哦。
🐕 A modular analytics layer in Swift
在公司里撸业务的开发同学对数据打点应该都不陌生,很多需求甚至一半的时间会花在实现打点逻辑上面,本文提出了一种抽象打点层的设计,用很 Swifty 的方式实现了可扩展(无痛添加新的 event),和后端解耦(切换打点 backend 不需要重构客户端打点代码)以及易配置(不同的打点携带不同的参数)。本文所体现的设计方面的思考对打点之外的一些公共组件的设计也能起到一定的指导作用,值得学习。
🐢 Seemingly Impossible Swift Programs
本文借助 “Swift 中判断函数相等性” 的命题极力使用简单的描述和循序渐进的过程来讲解复杂的拓扑数学。
在建设性数学中,任何命题都可以转化为类型,任何证据都可以转化为这种类型的值。这使得我们能够将函数抽象成计算过程和返回值。在拓扑数学中,无限多数据的行为也会表现得像有限集合。 这使得我们可以证明这些计算过程的相等性。
虽然论证的过程和结果对于日常的 Swift 开发并没有用,但希望它们可以让你对数学燃起兴趣并感到敬畏。要知道数学已经能够产生这样一个违反直觉的结果,并对其原因进行极其简洁的解释。你甚至可以相信数学是指导你如何更好完成编程的灯塔。这些简单的数学结构(Functions, Monoids)构成了抽象的强大基础,而不像项目中的那些设计模式,过于复杂且只解决特定问题。
🐕 使用 Metal 和 Core ML 评价照片质量
文章展示了常规算法+机器学习来评价照片质量的方法,常规算法使用 Metal 处理图片,根据饱和度、亮度、模糊度和颜色分布得出客观评分,机器学习则使用 Core ML 加载 NIMA 模型预测主观评分。得到照片评分后,再检测相似照片,最终挑选最优的照片推荐给用户。
demo 中给出了 Metal 版边缘检测滤镜与图片特征向量提取的代码,可供学习参考。文章还总结了开源模型转化为 mlmodel 过程踩的坑。
🐢 Why should we use Swift over Objective-C?
Swift vs Objective-C,到底该怎么选?如果你正在纠结这个问题,请细读此文。
Objective-C 有着几十年的历史,更稳定;Swift,更现代化的语言,有许多先进特性,文章从多个角度对比了两种语言的优势和劣势。
🐕 Strategy pattern in Swift
文章作者提出了一种用 Strategy pattern 思路来统一代码接口的做法。如果你对 Strategy pattern 不是很熟悉的话,可以看一下 Wiki 中这里的介绍。
这种模式在现实场景中有时候还是能起到一定的作用的,有兴趣的同学不妨读一读文章,说不定以后就用上了呢?
🐕 Using errors as control flow in Swift
本文重点集中在使用 errors 上,主要介绍了一些用 errors 来进行处理能有明显优势的场景,而这些场景主要包括了函数输出结果的错误的处理,输入参数验证和测试中错误的抛出等。
由于 Objective-C 或多或少的影响,很多同学在写 Swift 的时候依然没有习惯用 errors 来进行错误处理。如果存在这样的情况的话,不妨可以从下一次小 refactor 中出发去寻找有没有可以使用的场景,多尝试,逐渐就能习惯使用。
🐕 Xcode UI Testing Cheat Sheet
文章列出了 UI Testing 常用的代码片段,除了对 API 的梳理,还有对各种常见问题的解决方案,可以作为 UI Testing 的快速入门,也可以作为知识库以备日后查阅。
🐢 质量监控-图片减包
本文作者提供了三种方法,通过对图片资源的处理以达到减小包大小的目的。这三种方法分别是:
- 使用工具压缩图片
- 查找删除重复图片
- 查找复用相似图片
作者不仅详细讲解了具体的实现原理,还提供了相关实现代码。有兴趣的同学可以参考作者提供的方法,对自己的项目进行改造优化。
🐢 Metal 专辑
Metal 官方文档的中文翻译和 Metal 相关技术博客,适合英文不太好的同学。
🐎 【AR 开发】ARKit 和 ARCore 功能对照表与定位场景总结
ARKit 和 ARCore 功能对照表与定位场景总结,如果您同时开发 ARKit 和 ARCore,可能会用得上。
设计
🐎 Animations in iOS: 30 beautiful examples
有一些 iOS 动画真的很神奇,顺滑和友好的过渡动画能够指引流程,让用户理解下一步操作,即使盯着进度条也能感觉愉悦。下面请欣赏文中列出的 30 个动画杰作。
代码
Kingfisher 5.0 发布
喵大的 Kingfisher
迎来了5.0的大版本更新,更新日志中的 Reborn
一词意味着重大更新。
Kingfisher
是一个轻量级的、纯 swift
网络图片加载库。虽然是大版本更新,但是 API
的变化不大,如果你从4.0升级到5.0或许只需要几分钟处理一下警告和错误。其中最大的变化就是提供了更好的缓存策略。因此,同学们可以考虑升级一番。
- 加入
Result
类型取代原来的tuples
回调 - 为了方便调试追查错误,返回错误信息增加了错误原因和必要的关联信息
ImageCache
重写,提供内存和硬盘缓存策略,API
兼容旧版本,同时提供了控制缓存最大值,是否预缓存等等配置- 缓存策略:先搜索内存,没命中则搜索硬盘
- 支持
ImageDataProvider
协议加载本地图片
更新详情请参考:
Swift 官方 Docker 镜像
苹果维护的 Swift 镜像,现在已经被 Docker 官方收纳。因此只需要执行 docker pull swift
即可方便搭建 Swift 的各个版本环境。目前来看苹果对于此镜像的维护程度还是蛮高的,最新支持到 Swift4.2.1 版本,与开发版本同步。
音视频
🌟 Functional Swift Conference 2018
Swift 从诞生之日起,就具备了海量的函数式编程特性,无论是 enum 和 optional 的实现,或者是函数被当做一类公民,整个语言能看到不少 Haskell 的影子。自然,Swift 在实现一些函数式的思想和特性也非常的得心应手。Swift 的函数式编程,目前最经典的应用场景主要还是构建响应式的 viewmodel。如今,越来越多的人开始探索其他场景。Functional Swift Conf 是一个在纽约举行的,专门探讨函数式 Swift 的技术大会,如今已经放出所有的 presentation,其中除了一些 reactive view model 这样耳熟能详的话题之外,还有关于 state 管理、可组合 UI 等很有趣的内容。对函数式编程感兴趣的同学不容错过。
ggtalk | 要不要买 HHKB?我问了七位用户,听听他们怎么说
键盘,尤其是机械键盘,一直是程序员们居家旅行最重要的单品。甚至对于大多数程序员来说,键盘可能是极少数不多的可以让自己愿意一直花钱的东西,这就牵涉出一个话题:对于大多数程序员而言,什么键盘才是自己的最后一把键盘呢?本期 ggtalk,几个程序员针对这个话题,聊了聊自己使用 hhkb 的感受,有兴趣的同学可以听听。
PS:节目里没有严谨客观的评测。主观感受居多,比较轻松。
🚧 MVC is Not Your Problem - Joachim Kurz - UIKonf18
近年来,MVC 开发模式饱受争议,还经常被人抱怨说在这种模式下写出来的代码太多,耦合太重。于是就有很多人力图通过不断分解和改良 MVC 模式来解决它带来的问题。
UIKonf 上的这场分享就是从 MVC 切入来讲架构设计的。一开始先是介绍 MVC 模式,随后指出了很多人都误解以及用错了 MVC(分享中引用了很多参考资料,调研很充分),继而引出了大家容易忽视的点:有问题的不是架构模式,而是使用方式。即使是其他的架构也会带来其他的问题,如何通过 MVC 以及其他架构来达到开发目的才是重点。
本场分享者 Joachim Kurz,他的观点很明确,做架构设计,不需要刻板的遵循和套用规范,可以通过寻找合适的分解维度(分享的最后有介绍,27 分钟之后),让架构变得合理易懂即可。架构设计适可而止这个度是比较难把握的,需要深入具体需求场景(分享中举了几个例子,其中有介绍一个页面用到 10 个 ViewController 的),在平时的开发过程中不断实践和总结。
内推
-
小红书北京/上海招聘 iOS/Android 开发者:负责开发小红书 APP,APP 改变了大多数人的生活方式,我们改变了大多数女生看待生活的方式,加入我们,与一群年轻有趣的小伙伴一起打造下一个亿级用户产品。邮箱:[email protected]
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解更多公司及岗位信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@张嘉夫,@AidenRao,@Parsifal,@aaaron7,@tom510230,@anotheren,[@水水](https://www.xuyanlan...
老司机 iOS 周报 #47 | 2018-12-10
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
福利
🌟 我们发福利啦~
周报已经快陪伴大家走过一年的时间,非常感谢各位朋友的支持和厚爱。为了在 2019 年能更好地为大家服务,我们举办了一个问卷调查活动。在 12 月 27 日,我们会在参与问卷的朋友中选取合适的几个人赠与学习大礼包和现金奖。至于奖品是什么,大家可以在这条微博中了解,转发还有额外的抽奖~我们渴望听到你们的声音!
新闻
🌟 Result 类型将加入标准库
Result 类型经历了一整个月的讨论终于决定加入标准库,预计 Swift 5 就能完成实现,这次的提案关注的人非常多,经历了两次修改三次讨论才最终通过。
讨论的焦点主要集中在 Result.Error 的定义上,喵神也写了一篇文章讨论这个问题,一句话总结就是,Swift 出于兼容性和实现的考虑,一直没有实现 Typed Throw,所以 Result.Error 很难实现为一个泛型参数,甚至在草案阶段决定让 Result.Error 不遵循 Swift.Error。
后来 Swift 团队专门给这个提案开了后门,调整了泛型参数的实现,让 Swift.Error 成为了目前唯一一个可以作为泛型参数存在的泛型类型,以便与 Cocoa 的 API 进行更好的交互,才结束了这场讨论。
从这一次也可以看出,Swift 核心团队还是希望让抛出的错误能够有具体的类型(而不是一个泛型的 Swift.Error),所以才会开后门使用这种过渡性的方案,这次的提案让我感觉 Typed Throw 还是有希望的。
另外如果大家有兼容性方面的担忧的话,由于提案的作者是 Alamofire 负责人之一,所以最终通过的版本与 Alamofire 采用的 Result 差异很小,如果你采用的是这个版本的 Result 的话,就不必过多担心。
Flutter 1.0 正式版: Google 的便携 UI 工具包
万众瞩目的 Flutter 1.0 终于正式发布,从我们首次看到 Flutter 的 Beta 测试版,到如今的 1.0 正式版,总共经过了 9 个多月。Flutter 的高性能跨平台渲染与热重载等优秀的特性相信会让移动开发者们眼前一亮,在早先 beta 期就已经有很多公司与团队进行了这方面实践,现在 1.0 来了,作为移动开发者当然要感受一下
Flutter 的魅力。
文章
🌟 🚧 🐢 Dependency Injection on iOS — part 1-4
本长文的主题是关于架构的,切入点是依赖注入在 iOS 上的应用,共分成了四篇文章。作者从描述模块耦合的概念,到介绍使用依赖注入能带给我们的好处(可复用性、可维护性、可扩展性和可测试性),以及推荐了一款依赖注入的框架(Swinject)后开始进入正题 —— 通过编写和优化一个简单应用来实践依赖注入的概念和感受它带来的好处。全文结构非常清晰,举例也很详尽,是一篇学习和感悟架构,特别是依赖注入的好文章。
🌟 🐢 iOS App冷启动治理:来自美团外卖的实践
文章整理了 APP 冷启动的三个阶段,对三个阶段分别提出了存量解决方案、管理增量方案和监控体系。下面几点是文章观点的总结:
- 冷启动阶段T1: 点击 APP 图标进入至 main 函数,这两者之间的耗时
- 代码瘦身,废弃无用代码和资源文件
- 延时 +load 函数,将函数延迟到合适的触发时机,比如说冷启动结束之后
- 冷启动阶段T2: main 函数后至 didFinishLaunchingWithOptions 函数执行完毕,这两者之间的耗时
- 整理 APP 启动阶段,顺序化子项目的启动顺序
- 分阶段启动,利用自验的
Kylin
项目,将子项目的注册信息(启动阶段、启动需要执行的代码等)写入__DATA
数据段中,运行期读取__DATA
段代码,并赋予执行。 - 利用工具(Time Profile/自研的 Caesium)整理执行过程中的一些隐晦耗时,比如归档操作、IO操作、资源任务等
- 冷启动阶段T3: didFinishLaunchingWithOptions 函数至首页渲染完成,这两者之间的耗时
- 将 APP 的 RootViewController 设置为闪屏,同时进行首页UI的构建,加快 RootViewController 的加载
- 整理首页加载的串行操作,优化体验成并行操作
- 数据监控:除了上述的优化外,建立监控体系,保证持续优化成果
- 冷启动的开始与结束时间对比,值得注意的是这里的开始时间采用了 APP 进程创建时间
- 冷启动过程中的关键节点都有手动添加的测速点,并自动上报
🐕 如何提高工作效率 - 自动化篇
在本文中,作者向我们介绍了 macOS
环境下几种自动化的实现方案,并以自己的亲身实践案例为我们讲述了大体的实现流程,以下为文中的案例:
- 利用
Shell Script
和启动加载任务,在开机过程中自动配置双网卡 - 利用
Apple Script
访问Microsoft Outlook
自动生成和填充邮件,完成每日邮件汇报工作 - 利用
Apple Script
和热键,快速定位当前 Finder 路径到 iTerm 的窗口当中 - 利用
Apple Script
和Alfred WorkFlows
进行快速保存/搜索记录瞬间想法 - 利用
Shell Script
和Apple Script
定时拉取并编译代码
🐢 iOS 内存管理的那些事儿
iOS
中的内存管理一直是令开发同学们比较头痛的事情,自 ARC
问世以后,虽然不再需要我们手动管理内存,但是掌握内存管理的相关知识依然是十分有必要的。
作者通过研读源代码的方式向我们详细讲解了内存管理的实现原理,并列举了一些日常开发中容易导致内存泄漏的常见场景,掌握这些有助于我们在复杂业务场景中更好的避免内存相关的问题。并且作者后续会介绍一些开源检测内存泄漏的工具及实现,大家可以持续关注。
🐕 Rethinking Design Patterns in Swift: State Pattern
这篇文章展示了如何在 Swift 中实现状态模式(State pattern),借助 Swift 强大的能力,让模式实现变得简单而又灵活。此文通过一个实例来探索状态模式的各个方面,并且评估其处理需求变更的能力。然后还会讨论实现该模式的关键考量、收益以及实际应用。
🐎 技术人的成长
作者从自身的经验和感悟出发,从三个维度描述了技术人的成长道路
- 抵御所谓“全栈”的诱惑,聚焦领域。
- 扩大视野,提高技术敏锐程度。
- 多看多尝试,不要空想
总体来说,就是到了一定的技能熟练度以后,从广度上拓展自己的知识面,从深度上钻研某一个垂直领域,将能够极大的帮助大家从普通工程师进阶到高级工程师。
🐕 Category:从底层原理研究到面试题分析
随着移动端的发展,从 weak
面试题的一步步升级就能明白,我们应该多进行深入了解底层实现细节。
作者从源码进行一步步分跟踪和分析,整理 Category
整个的执行顺序,非常适合想了解其工作原理的同学们看。并且还提供了一个简单动画示意图。通过阅读,可以清晰地回答面试中常见的几个 Category
相关的问题。
另外 load
和 initialize
也给出了源码分析和对比表格。在准备面试的同学,尤其适合阅读一番。
🐢 iOS: ARM64不定函数传参问题调试剖析
从实际开发中遇到的一个平台相关的 crash 问题出发,通过代码对比,研究了在 x86-64 架构和 ARM64 架构对于不定函数参数传递的方式——特别是 iOS 系统的不同之处,同时也解答了为什么在调用带不定参数类型的 C 函数指针时,应该显示将其强转为对应参数类型的函数指针问题。
🐢 【译】Swift 中的面向协议编程:是否优于面向对象编程?
本篇是 SwiftGG 最新出炉的译文,原文在上月 周报第42期 推荐过,可以再回顾一下。
🐢 Swift Protocols: Tips and Tricks
Protocol
是 Swift
的基础,我们可以定义方法,甚至提供默认实现。本文介绍了 Protocol
的一些小 tips,比如 协议组合
、Protocol extensions
、利用 Protocol 实现模板方法设计模式
等。
🐎 8 Useful Swift Extensions
文中列举了 8 个Swift中比较实用的 Extensions,比如字符串中字符个数、计算两个日期之间的天数,给字符串添加前缀等。当然,我觉得这 8 个远远不能满足于日常的开发,所以我更推荐大家看一下 SwifterSwift 这个库,里面都是很实用的 Extension。如果你有什么不错的 Extension 推荐,也可以给这库贡献自己的代码哦。
🐕 simctl
simctl
是苹果提供给开发者驱动 Xcode Simulator 的命令行工具。我们能够通过它做到:启动模拟器,在桌面和模拟器之间复制和粘贴,进行视频录制等。
🐢 Swift Program Distribution with Homebrew
本文介绍了当你创建了 mac 上的命令行工具的时候,如何进行分发,文中介绍的工具是 Homebrew 。
- 创建一个 Makefile 文件
- 编写一个 Homebrew formula (相当于编译打包)
- 自测需要,可以先试试本地安装,确保安装过程顺利
- Homebrew 安装 formula 是基于 Tap 的,所以需要发布一个 Tap
- 用户可以根据远端的 Tap 来安装 formula 了
🐢 与 JOSE 战斗的日子 - 写给 iOS 开发者的密码学入门手册
JOSE (Javascript Object Signing and Encryption) 定义了一系列标准,用来规范在网络传输中使用 JSON 的方式,本文介绍了 如何使用 Security.framework 处理 JOSE 中的验证。对比已有的 JOSE 实现框架,譬如 JOSESwift ,JSONWebToken.swift , Swift-JWT , vaper/jwt 等等,作者的方案优势在于同时支持 RSA 和 ECDSA ,并且不需要引入复杂的依赖关系
设计
工具
Publish Your Flutter App on macOS
最近 Flutter 扩张势头似乎没有停下来的意思,反而看起来越来越凶猛了。
Flutter 除了可以写 iOS,Android App 之外,其实,也是“支持” macOS, Windows 和 Linux 的。只是这并不是那种官方支持,而只是把移动版 App 直接跑在 Desktop 上, 类似明年 macOS 要支持 iOS App 运行一样。
Google 的 Github Repo 下有一个叫 flutter-desktop-embedding 的项目,就是做这样的桥接工作的,只是这库确实不是很好用,使用比较麻烦。
于是有第三方开发者做了基于 flutter-desktop-embedding 的工具,可以方便的将你已有的 Flutter 工程打成 macOS 包。同时他们还做了一个小型商店,开发者可以一键上传,其他人也可以很方便的下载安装。
有兴趣的童鞋可以尝试一下把自己的 Flutter App 跑在 macOS 上,来看看那是什么样的感觉。
音视频
ggtalk | 聊聊 Swift 这四年(下)
上周推荐了上部,收到了不错的反响。在这期(下)中,几个程序员聊了最近几年 Swift 领域发生的事情,比如 jspatch 导致的大规模下架事件,第二第三届 Swift 开发者大会的一些故事。最终探讨了 Swift 的未来,内容同样精彩,不容错过。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解更多公司及岗位信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
关注我们
我们开通了公众号,每期发布时公众号会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao,@Parsifal,@aaaron7,@方秋枋,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦Ben,@红纸,@含笑饮砒霜,@JimQ
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #46 | 2018-12-03
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
Apple 举办编程一小时活动
在 12 月 1 日至 14 日期间,Apple 将在全国的 Apple Store 零售店举办「编程一小时」活动,现在已开放报名。你将有机会从编程基础知识入手,用 Swift 语言写代码,为机器人编程。也许这一小时的课程,将开启你对编程一生的热爱。
App Store Connect Holiday Schedule
因圣诞假期,App Store 将在 12 月 23 日至 27 日停止应用审核。
文章
🐕 Animations are assets: using Core Animation archives on iOS
作者在逆向过程中发现了 Animations
也可以作为资源归档,并且在2016年的时候已经上线了一款使用该技术的 APP。
简单而言,就是将 Core Animation
添加完动画效果的 layer
利用 NSKeyedArchiver/NSKeyedUnarchiver
进行归档,然后在 APP 需要动画的时候进行加载,文中附有 Demo
。
- 使用 Kite软件 进行方便动画的制作,并且导出
CAAR
文件(也可以自行代码archiver
后导出)。 - 因为导出的文件是一个
CoreAnimation layer tree
,你可以实现颜色改变,形变等CoreAnimation layer
的动画效果。 CAAR
文件独立,意味着你可以放在Asset Catalog
,Bundle
,甚至服务器下发。- 不需要依赖另外的第三方动画框架。
延展阅读:
🐢 iOS 12 Password Tools: Improving User Security and Experience
在本教程中,您将使用这些 iOS 12 安全工具,使您的用户能够:
- 在您的网站和您的应用之间共享和同步密码。
- 保存并更新iOS密码。
- 自动生成安全密码。
- 访问通过短信发送的验证安全代码,无需离开应用。
🐕 Extending optionals in Swift
Swift 中的可选值实际是定义了一个 Optional<Wrapped>
枚举,所以我们可以通过扩展枚举,让我们以一种更好的方式处理可选值。
我们可以给枚举添加一个扩展方法,当值为 nil
的时候抛出 error
,直接将方法接入到调用末尾,则能轻松将缺失值转换为一个错误。
当然你也可以发挥更多想象力,添加扩展将值的逻辑判断代码、类型匹配代码等等操作封装起来,最终得到一个更好,更容易阅读的调用链。
🐎 When to use UserDefaults, Keychain, or Core Data
本文总结了我们开发过程中常用的几种数据存储方式的使用场景,以及它们的使用方法和注意点。都是比较初级的知识,但作者写得很详细,总结的也很到位。
-
UserDefaults
用来存储不敏感的少量数据,比如需要持久化的用户设置、游戏分数、播放的歌曲名等。
-
Keychain
用来存储相对敏感的少量数据,比如用户密码、内购状态、令牌密钥等。
-
Core Data
用来存储数据量大的列表、关系型数据,以及需要查询和筛选的数据,比如 Todo 列表、文章评论等。
🐢 A Comparison of Swift and Kotlin Languages
尽管 Swift 和 Kotlin 在语法上有太多相似的地方,但也仍然有很多核心特性上的差异。本文重点介绍了 Swift 和 Kotlin 之间的异同。
从代码风格和语法层面详细对比了属性,数据结构,方法,闭包,可选类型,流程控制,类,扩展,协议,功能性语法等重要语言特性的相似点和不同点。同时推荐了许多其他对比 Swift 和 Kotlin 的文章。
🐢 手把手教你给企业微信 Mac 客户端去除水印
目前,许多公司使用了企业微信作为内部聊天工具,既然是企业级的,免不了界面会有水印,这可以使公司的内部信息被员工截图散播出去时候可以有效的溯源等等。
水印有两种情况,一种是在客户端合成的,另一种是 server 下发的图片就带有水印。前者通过反编译客户端进行去除,而后者相对较难,只能通过图像技术去做。企业微信 Mac 的客户端水印就属于前者。
所以,文中笔者就尝试反编译的手段成功去除了水印。不过,本文更适合作为反编译的实战教学文章来观看,一方面是截图公司的信息散布出去本事也并不好,另一方面是不能保证微信企业客户端没有暗水印。
🐕 Evaluating SwiftSyntax for use in SwiftLint
之前 SwiftLint 是基于 SourceKit 封装了一套 API 去处理语法规则的。现在 SwiftSyntax 出来之后,本来打算使用它去简化之前的语法规则,结果发现运行效率竟然变低了。文中笔者给出了具体原因:SwiftSyntax 对于每个文件解析都新开一个 Swift 编译器实例拖慢了整体速度。
🐕 解读 App Store 审核黑箱政策 —— 远没有你想象的那么邪恶
作者在 App Store 上架了 15 款应用,与 App Store 审核的往来超过几百次,在这篇文章里,作者分享了他对 App Store 的理解和看法,具体包括 App Store 采用黑箱审核的原因、为何难以得到清楚的答复、双标情况以及对于 App Store 审核的几点建议。
工具
ReadyForBAT - iOS 面试准备之思维导图
作者在学习完慕课网 iOS 面试实战项目后利用思维导图做了总结。这套导图覆盖面较广,可以给正在跳槽或者准备年后跳槽的各位同行用作参考,好好梳理一遍自己的知识体系。
Komondor - Git Hooks for Swift projects
Komondor 是一款帮助简化 Git Hook 设置的工具,它依赖于 Swift Package Manager 的运行,只要在 Package.swift 里加上依赖,然后像这样去指定 hook 就可以完成设置:
import PackageConfig
let config = PackageConfig([
"komondor": [
"pre-push": "swift test",
"pre-commit": [
"swift test",
"swift run swiftFormat .",
"swift run swiftlint autocorrect --path Sources/",
"git add .",
],
],
])
代码
appstoreconnect-swift-sdk
上个月苹果终于将 WWDC 2018 里提到的 App Store Connect API 开放给广大开发者。这是一个基于 Swift 编写的 SDK,可以让开发者方便地使用苹果开放的这些接口。
音视频
ggtalk | 聊聊 Swift 这四年(上)
Swift 自第一次推出到现在,已经有了四年的时间。这四年语言本身经过了很多发展,很多改变,而国内的 iOS 开发行业,Swift 开发者的生活和工作,也发生了很多变化。从 14,15年的黄金时代到16年的 ‘iOS 没人要了’,再到18年的 ‘iOS 又有人要了’,今年,Swift 5.0 终于提出要把 ABI 稳定放在首位,这应该算一个 Swift 重要的一个里程碑。在这样一个时间点,ggtalk 请了几个使用 Swift 的程序员,一起聊了聊 Swift 的这四年(ggtalk 是国内 Swift 社区 SwiftGG 推出的程序员闲聊节目)。有空的时候可以听听,相信同样写 Swift 的你,会有共鸣。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解更多公司及岗位信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
关注我们
我们开通了公众号,每期发布时公众号会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao,@Parsifal,@aaaron7,@方秋枋,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦ben,@红纸,@含笑饮砒霜,@JimQ
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #45 | 2018-11-26
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
小专栏
这份文档主要基于微博 @SwiftLanguage 跟踪过活跃于 Swift 语言领域的那些 GitHub 开源项目,顺便也是对于过去几年关注的内容进行一次系统化梳理。尝试整理出一份相对结构化且精练的 Swift 开源项目参考知识库,它将主要以思维导图形式呈现。
文章
🌟 🐢 Hades:移动端静态分析框架
本文介绍了大众点评基于 Objective-C 的代码静态分析工具 Hades 的研发经验,重点解决了以下痛点:
- 开发成本高,收益有限,研发参与积极性不够。
- 针对局部代码分析,跨编译单元以及全局性分析较难。
- 增量分析困难,CI 静态检查效率低下。
- 工具性较强,大部分只作代码规范检查,应用范畴局限。
- 接入和维护成本高,难以平台化。
Hades 相对于市面上已有的工具,在研发端解决了代码检查规则维护困难的问题,在 CI 端解决了性能问题,因为针对每次检查都可以持久化 Model 对象,在扩展性上还有很大的想像空间,大众点评团队为我们提供了很好的代码静态分析工具研发思路。目前 Hades 还是闭源阶段,将来有可能转为开源。
P.S. 目前iOS平台上的代码静态分析工具一览表
SwiftLint
Appscreener
Checkmarx
Fortify
Infer
oclint
Veracode
🐕 Swift Development with Visual Studio Code
Swift 在早些时候宣布将支持 LSP(Language Server Protocol),整个社区都沸腾了。人们涌上街头,奔走相告,一遍遍的确认着:我们可以摆脱 Xcode 了吗?VSCode 作为 LSP 支持的先驱者与佼佼者,目前基本已经是行业排行第一的通用型代码编辑器。
本篇文章由 mattt 大神出品,详细介绍了怎么在 VSCode 中配置 Swift 的开发环境。目前虽然 Swift 的 LSP 支持还处于 early stage,但已经可以支持最常用的自动完成、快速帮助以及跳转定义等功能。并且基于 VScode 强大的插件生态,还有 SwiftLint 这样的插件可以来提升代码的风格优化。不得不说,人们对于 Swift,尤其是非 Apple 生态下的 Swift 开发体验跨越式升级,已经发生。
🚧 🐢 Xcode and LLDB Advanced Debugging Tutorial
作者准备了一个简易项目,演示了如何利用 Xcode 和 LLDB 进行高级调试。
-
第一部分 在断点处添加调试命令,注入一行新代码进行调试。
-
第二部分 通过给属性添加观察点,当其变化的时候,会中断程序,观察到属性变化的前后值,及可以进行堆栈追踪。
-
第三部分 在断点中,通过调试命令新增新的断点,使断点在某些场景下才开始执行,更高效的追踪问题。
🚧 🐢 A taste of MVVM and Reactive paradigm
本文通过一些简单的类讲述了什么是 MVC 和 MVVM,以及如何进一步研究 Rx。您可以自由地创建自己的架构,但无论您做什么,一致性都是关键,不要让别人看的时候感到困惑或惊讶。
所有设计模式的简单原则可总结为:
- 确定应用程序的各个方面的变化,并将它们与保持不变的方面分开
- 编程到接口,而不是实现
- 组合好过继承
希望本文对正在为架构选型而头疼的朋友有所帮助。
🐕 实用的可选项(Optional)扩展
Option
是 Swift
最基础的内容,它迫使开发者们处理好一些临界情况,使得程序更加健壮。标准库中 Option
的 API 非常少,编码过程中通常需要配合 if let
guard let
一起使用,这容易造成多分支。作者参考了 Rust
Scala
等语言的实现,给出了一些 Option
扩展,或许你可以用于自己的项目中。
🚧 🐕 Stubbing in pair with Swift compiler
Unit tests 中 stubbing 是一个很常见的做法,现在也有很多成熟的框架。而本文却从另外一个角度来做: 利用 Swift 的语言特性来做另类的轻量级的 Stubbing。
这种做法的应用面虽然比较有限,但是不妨可以了解一下作为参考。
🐕 关于 performSelector:afterDelay: 的一个坑及思考
本文通过对于 performSelector:afterDelay:
函数进行了研究,总结了以下三点内容:
- 在一个没有开启
RunLoop
的子线程中调用performSelector:afterDelay:
函数,最终是不会被执行的 - 看似相近的 API,可能不是同一个模块提供的,其实现方式也不尽相同
performSelector:
来自于NSObject.h
,其是有 id 类型的返回值,并不依赖于子线程的RunLoop
开启状态performSelector:withObject:afterDelay:
来自于NSRunloop.h
,其并没有返回值,依赖子线程的RunLoop
开启状态performSelectorOnMainThread:withObject:waitUntilDone:
来自于NSThread.h
,其并没有返回值,依赖主线程的RunLoop
开启状态
performSelector:
中函数定义在其他地方就会引起编译警告,如果函数没有返回值可以使用performSelectorOnMainThread:
或者performSelector:withObject:afterDelay:
来避免编译警告
🐕 函数式编程 - 有趣的 Monoid(单位半群)
本文介绍了在函数式编程中比较核心的一个概念 Monoid(单位半群)。从半群到单位半群,从数学定义到 Swift 的展开实现,以引导教学的方式带领读者一步步深入了解 Monoid,极易消化理解。后半部分介绍了几个有趣实用的 Monoid 类的数据结构,且都有递进式的概念讲解及 Swift 实现。
另外,本文是近两年来作者关于函数式编程系列文章中的最新一篇。本系列文章同样都是采取引导递进式的行文风格,作者从 Haskell 这种标准化的、通用纯函数式的编程语言中汲取灵感,将诸多函数式编程的核心概念改造为 Swift 实现,让我们从新的角度去认识 Swift 以及 与 Swift 相关的函数式编程思想,Swift 或 函数式编程爱好者不容错过。
🐎 Unit testing retain cycles
循环引用问题会造成内存泄露,轻则影响应用性能,重则导致应用闪退,非常影响用户体验。同时它也是不太容易被发现的。所以在开发测试过程中,增加对循环引用的检测很有必要。
本文就介绍了如何在单元测试中检查循环引用。思路很简洁,通过建立弱引用去检测。这样我们就能保证代码库本身没有问题,正如文末所说的 “get a level of comfort”。除了检测方式,作者所表现出的这种为代码负责任的态度也是值得我们学习的。
🐕 Self-sizing Table View Cells
这是一个关于 tableview cell 的布局教程,该本教程中,您将学习如何启用自动调整大小的 cell ,以及如何使它们按需调整大小并支持动态类型。该教程通过 storyboard 加代码的教程形式,一步步完成一个大家常见的 tableview 需求,并附上了项目 demo 。
🐕 Extending optionals in Swift
Swift 里的 Optional 虽然帮助我们保证了内存安全访问,但在很多情况下都需要我们解包后再进行操作,让代码显得比较啰嗦而且不连贯。
Sundell 这周就给我们带来了 Optional 的实用拓展,总结了一些 Optional 常见场景,并且构建对应的语法糖去优化 Optional 的使用。
🐕 Swift Async Operations at Your Command
当一个操作相对比较复杂时,使用 Operation 封装上下文会是一种比较合理的做法,这篇文章里作者分别介绍了 Fabric 封装的 FABAsyncOperation 和 FABCompoundOperation 以及各自的使用场景,并且讲述了他在项目中使用 Swift 重写的过程。
🐕 关于 Swift defer 的正确使用
在 Swfit 中,defer 关键字即为延迟的意思,用 defer 声明的 block 并不会立刻执行,而是在当前代码执行退出后被调用,这类似于 JAVA 里的 try/finally。最近,喵神在重构 Kingfisher
的时候,因为 defer 的使用不但而造成了 bug。为此,喵神完整梳理了下 defer 的特性以及使用方法。
代码
30-seconds-of-swift-code
一个立志于让你 30 秒看懂一段 Swift 代码的项目,较为新手向,方便新人快速了解 Swift 的内建函数。当然老鸟也不妨一读,总有你漏掉的知识点。
LINE SDK for iOS Swift
用 Swift 开发的 iOS LINE SDK 可以让我们用现代化的方式来实现 LINE API,包括用户认证及通过 OpenID 获取用户信息等功能,为 iOS app 开发有吸引力的、个性化的用户体验。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳字节跳动研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解更多公司及岗位信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
关注我们
我们开通了公众号,每期发布时公众号会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao,@Parsifal,@aaaron7,@方秋枋,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@邦Ben,@红纸,@含笑饮砒霜,@JimQ
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #44 | 2018-11-19
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
文章
🐢 Implementing features with ReactiveFeedback
本文作者通过一个实例演示来介绍他们团队写的单向数据流应用框架 ReactiveFeedback。由于作者所在团队用的是 ReactiveCocoa
,所以他们就基于 ReactiveSwift
自己实现了一套类似 RxFeedback
的框架。
虽然是教程类的文章,而且还是写自家框架的,但是阅读本文还是会有三层收获:
- To 普通开发,了解应用开发还能这么玩。如果大家对
Redux
,ReSwift
,RxFeedback
这些比较熟悉的话,文中介绍的框架结构和用法还是很好理解的。即使不熟悉,认真看也是能懂的,因为文章写得真是超级详细; - To 框架维护,理解他们做类似架构演进的思路。单向数据流应用框架的可维护、可预测以及可测试性等这些特点可以较好地解决一个复杂应用工程会面临的臃肿混乱难以管理的问题。文中也提到
ReactiveFeedback
没有设计全局的应用状态,但是每个功能模块与外部交互时都有明确的主入口,内部只有自己独立的状态,使用起来非常简单灵活和方便; - To 技术管理,通过技术手段来提高工程质量和效率是非常有意义的,特别是大家一起维护一套开发框架。能对应用架构和编程模式不断地进行探索,也是工程师文化的很好体现。经常做这类技术输出的团队肯定也是大部分人所向往的有技术氛围的团队。
🐢 Docker ❤️ Swift & Vapor
Docker 作为近几年来服务端最重要的技术创新之一,解决了无数配置与运维的噩梦。而另一边,Server-side Swift 的蓬勃发展,似乎和 Docker 拥抱已经是一个必然。本文既是一篇非常棒的 docker 入门文章,用很简洁的篇幅讲了 docker 是什么,能做什么,并且给出了相应的学习路径,同时,也是一篇介绍如何使用 docker 技术来提升 Server-side Swift 的开发与配置效率的文章。作者生动的介绍了如何制作 Swift 的 docker image,如何实时修改 docker image 中的代码,最后还提出基于 docker compose 来实现基于 Vapor 的微服务架构,非常酷! 推荐大家阅读。
🚧 🐕 Assertions in Production
作者围绕断言的使用展开了以下探讨:
-
如何上报断言(Assertion)?
首先作者分享了将断言上报的代码片段。作者认为相较于 Property Testing(性质测试),断言等于真正的用户产生的 Property Testing,更加随机、多样和不可预测,而且不需要写任何测试用例。
-
何时加断言?
作者一般的规则是,在没有
else
的情况下,应该加断言。以下情况下也会加断言:确保方法传参正确的时候;从字典里用已知的 key 取值的时候(如NSNotification``userInfo
);确保必须在主线程进行的操作当前是否在主线程的时候;打开关键的数据库或者文件失败的时候。 -
对于线上的产品,是否应该让断言处 Crash?
作者认为没有必要。断言可以当做错误上报,但不应该造成闪退。
🐕 Avoiding race conditions in Swift
Race condition, 即竞争条件。我们都知道,当多个线程同时访问相同的资源,就可能会出现意想不到的问题。对此,线程安全一直是开发中需要额外关注的一个问题。本文讲了在 Swift 中,race condition 可能存在的场景,以及在平时的编码中,如何尽可能避免这种问题。
🐕 What's .self, .Type and .Protocol? Understanding Swift Metatypes
Swift Metatypes
,可能每天都在用,却很难解释清楚到底是什么东西,Apple 文档对此描述也比较晦涩,只说 type of a type
。
文章从最简单的 String
开始,讲 String.Type
、string.self
之间的关系,串起 .Type
.self
type(of:)
Protocol
,最后还介绍了一些 Metatypes
使用场景。
🐕 用 Swift 解读 React/React Native: Part 1 - React Element & React Component
本文系列文章第一部分,作者希望将 React/ReactNative
中的主要编程思想,应用在 Swift
中,以此提高提升开发效率和代码质量。作者认为 React
的核心概念为,将数据转化成视图描述数据,也就是 Data
到 React Element
的过程。在这个过程中,无形中引入了单向数据流,提升了代码的规范性和开发效率。文中介绍了如何用 Swift
实现 Componet, Element, Node
这几个关键部分。
🐢 Mirror / CustomReflectable / CustomLeafReflectable
相对于 Objective-C
来说,Swift 没有 Runtime
不能实现类似 swizzing
功能。但得益于 Mirror
的反射
功能,我们可以得到对象信息的只读访问,Playground
就是 Mirror
的一个主要场景。文章介绍了 Mirror
及相关的 CustomReflectable
CustomLeafReflectable
两个 protocol
使用细节。
🐕 分析实现-倒计时设计
倒计时器是一个日常开发中很常见的需求,通过 NSTimer
、GCD
或者 CADisplayLink
都可以轻易实现。本文作者在看到一个基于 NSOperation
的全局计时器方案后,引发了如何完成一个更高效、接口设计更合理的倒计时器轮子的思考。从选择存储结构出发,到最后的逻辑封装,作者一步步完成了自己的倒计时器。
虽然是一个很小的需求,但却很考验开发人员的编码能力,希望各位读者都能够从作者这种软件设计思维中有所得。
🐕 在 Flutter 中嵌入 Native 组件的正确姿势是...
闲鱼团队的新文章,他们算是最早用上 Flutter 重写自己 App 的大厂团队,趟过的坑一定不会少,也值得其他人学习经验。
Flutter 最近也在各个国内大厂掀起了应用浪潮,如果有打算应用 Flutter 或者是已经在尝试应用 Flutter 的同学们,不妨考虑先读一读闲鱼团队的系列文章,可以让你少踩很多坑。本文就介绍了闲鱼团队在项目中嵌入 Native 代码的做法和背后的源码中的原理,虽然 iOS 中还暂时没有出现和 AndroidView 对应的控件,但是相信之后一定会有对应的控件跟上。目前在 Android 端有需求的同学们不妨先学习参考。
🐕 CustomPlaygroundDisplayConvertible
本文介绍了我们熟悉的 Playground
,它通过 PlaygroundLogger
框架来实现实时反馈。文章前半部分花了大篇幅介绍这个框架支持展现的类型和 CustomPlaygroundDisplayConvertible
协议的用法。文章后半部分则从 Playground
自身的特殊性展开,总结了 CustomPlaygroundDisplayConvertible
跟 CustomStringConvertible
、CustomDebugStringConvertible
以及 Debug Quick Look
之间的关系。读完全文,不仅能让我们知道了 CustomPlaygroundDisplayConvertible
怎么用的,而且也清楚了它的具体使用场景。
🐕 Debugging a subtle Swift bug that will make you facepalm
Jesse Squires 在修复一个 UI 测试的崩溃时,发现是因为 json 序列化时使用了 [String: Any]
作为容器,赋值时少写了一对括号导致的问题:
func toDictionary() -> [String: Any] {
var dict: [String: Any] = [:]
// code setting other keys and values...
dict[JSONKeys.dateClosed] = self.dateClosed?.toMongoDate
return dict
}
extension Date {
func toMongoDate() -> [String: Any] {
// return date in expected mongo date format
}
}
这段代码是 Codable 之前就存在的,从这方面也印证了 Codable 的好处。
🐕 支付宝客户端架构解析:iOS 客户端启动性能优化初探
支付宝 mPaaS 团队又向大家带来了一篇启动性能优化的实践,本片文章主要从另一个角度探索启动性能优化,利用苹果的 Background Fetch 让 App 在后台的时候就能处理一些预加载任务,来解决真正启动性能中比较耗时的图片加载问题。我们也可以借此了解一下 iOS 的这种 Background Fetch 伪后台的作用机制
工具
Commander
Commander
简单而言,就是你通过 Decodable & Decoder
协议的规则书写 struct
来描述 cli
参数的输入,该库会进行解析检查,并且提供对应的描述帮助信息,也提供自动补全的机制。
Code Friend
自 Xcode 8 开始,苹果提供了 XcodeKit
用于开发 Xcode Extensions,但是开发者们似乎并不买账。Code Friend 通过 JavaScriptCore
封装了 XcodeKit
的原生方法,并提供了使用 JavaScript 接口来快捷地开发 Xcode 插件。你可以直接在 Mac App Store 中找到它,但是还是建议你先读一读这篇文章。
音视频
"Promises everywhere", with special guest Max Howell
15 年的时候,有位牛人,曾经在 Twitter 上吐槽自己去 Google 面试被拒经历。Google 说 90% 的工程师使用他写的软件,但是因为他不能在白板上翻转二叉树,so fuck off...这个事情相信很多人都听过,而这个人,正是大名鼎鼎的包管理软件 HomeBrew 的作者 Max Howell 。就在近期,Sundell 邀请了他作为嘉宾,在这期播客里讨论了包管理器的设计、异步编程、面试流程以及 Swift Package Manager 是如何诞生的。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解我所在项目组信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
关注我们
我们开通了公众号,每期发布时公众号会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao,@Parsifal,@aaaron7,@方秋枋,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦ben,@红纸,@含笑饮砒霜,@JimQ
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #43 | 2018-11-12
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
小专栏
From Swift To C++
来自微信团队的周报编辑芒果最新出炉的一篇文章。这篇文章按照编程范式(programming paradigm)来组织脉络,从一个客户端工程师的角度来品味和对比这 Swift 和 C++ 两门语言。如果你也在或者即将同时把 Swift 和 C++ 当做主流编程语言,那么这篇文章你绝对值得一看。
新闻
适用于触控问题的 iPhone X 显示屏模块更换计划
号外!号外!继“降频门”事件引起的 218 元换电池服务后,苹果又出免费更换 iPhone X 显示屏服务了。只要你的 iPhone X 经过测试满足以下两个问题,则苹果会替你免费更换显示屏。
- 显示屏或显示屏的一部分不响应或间歇响应触控操作。
- 即使没有进行触控操作,显示屏也会作出反应。
另外友情提醒,218 元换电池只剩最后一个半月了,还没换的小伙伴抓紧上,绝对能让你的老设备焕然一新!
文章
🌟 🐕 Language Server Protocol
前段时间 Apple Swift 团队在 Swift Forum 上宣布他们会对 Swift 和 C 系列语言(C/C++/ObjC)增加 LSP (Language Server Protocol)支持。这对于饱受 Xcode 折磨的开发者来说是个极大的利好,意味着在这之后可以有更多的第三方 IDE 支持。
Matt 的这篇文章,解释了什么是 LSP,LSP 是怎么工作的,以及潜在的可能带来的好处。
虽然 Swift 支持 LSP 的具体时间表到现在还没有放出来,但是受苦于 Xcode 的大伙们也算是有点盼头了。
🌟 🐎 Tricks & treats to make UI testing less terrifying
自动化测试,尤其是 UI 的自动化测试,对于国内大部分的开发者应该都是“只闻其声未见其人”的感觉,知道有这么个事儿,但基本都没怎么实践过。这一系列文章系统性的讨论了 UI 自动化测试的最佳实践。从如何标记 UI 元素到如何访问,最后在第三部分还探讨了一种编写 UI 测试的“设计模式”,名叫 PageObject 的编程模型,来提升 UI 测试代码的可维护性。
🐎 Stephen King's Advice To Software Developers
斯蒂芬·金,《肖申克的救赎》的作者。他曾在《On Writing》一书说,讲述了他的写作经验。学习技巧基本相通,因此本文作者将斯蒂芬·金的经验融合到软件开发实例中。
- 多输入,多输出
- 多输入:多看源码,
CodeReview
,博客,书籍,如无从做起,可多关注老司机周报。 - 多输出:对于想掌握的技巧,多进行刻意练习。
- 多输入:多看源码,
- 避免分心
- 规划时间,固定的时间做固定的事情,效率更高。
- 寻找专门的空间和可以集中精神的 2 个小时。
- 闭门,开门
- 专注开发完成后(闭门),接受
CodeReview
或者开源,吸纳更多的意见进行优化(开门)。
- 专注开发完成后(闭门),接受
- 杀掉你的所爱
- 每次优化,果断删掉你自豪但无用的代码,炫技不如贴合业务。
- 花时间
- 没有捷径,务必坚持(但是要注意学习技巧)。
🚧 🐕 How to remove duplication from Swift tests with helper functions
对于 XCTest 的单元测试来说,提取重复代码对于开发者而言并不友好,可能会出现如下几种问题:
- 执行过程中,Xcode 的断言函数停止在了提取函数内部。
- 多个单元测试同时报错时,需要展开错误信息才能了解到具体信息。
为了解决如上几个问题,作者巧妙的运用了 Swift 中 XCAssert
函数的另外两个入参 file
和 line
,来传递辅助函数调用时的文件和行号,这样 Xcode 就能够帮助你将错误信息正确提示到辅助函数调用的地方。
🐕 Keeping your code clean
写得一手好字,对于普通人来讲是一个很好的加分项,而是否写得一手简洁漂亮的代码则对于我们开发者来说更为重要。招聘单位往往对应聘人的代码风格都会有一定要求。本文分享了如何写得一手好代码的几个小技巧,很值得大家关注,并在平常开发中重视起来。
- LOC(Lines Of Code):代码应该足够精简,函数是最小的执行单元,避免冗长的代码集中在一个函数实现上。
- 正确的缩进:不管你是 “Tab” 党还是 “空格” 党,合适的缩进能让你的代码排版更加整齐,让人读起来更加舒适。
- 标准的命名:虽然命名一直是程序员的难题,但我们仍然需要能够很好的名字来提高我们代码可读性。
- 变量和函数的声明:在合适的地方做声明,按照功能进行分组。
- 代码风格:每个团队都应该有一套代码规范,来统一团队成员的代码风格。
另外,该作者还在最后为我们推荐了几个 Lint 的工具,可以帮助我们自动化代码规范审核,如 SonarQube、Tailor 以及 SwiftLint。
🐕 String’s ABI and UTF-8
近日,Michael Ilseman 在 Swift 社区论坛发文 String’s ABI and UTF-8
表示 String ABI 相关改动已提交到 master 分支。具体来说,这是底层实现的一次显著改动(这些改动在 API 层面无任何影响),其中最主要的一点就是原生 Swift 字符串会统一使用 UTF-8 进行存储(在内存里),而之前是根据内容选择 ASCII 或者 UTF-16 进行存储。
文章还特地提到:传统意义上中文字符串是 UTF-8 性能最差的场景(需对多个 UTF-8 编码进行重排合并得到 Unicode 码位),得益于现代 CPU 的改进,这些已不再是问题。
🐢 Result<T> 还是 Result<T, E: Error>
API 的错误处理一直是 Cocoa 做的不好的一部分。到了 Swift 时代,我们有了更好用的 enum,可以帮助我们统一 Data 与 Error 的封装。如果你常用 Alamofire,一定对它的 Result<T>
非常熟悉,对于错误,它仅要求满足 Swift.Error
。但是很多时候处理这个空协议依旧不是最方便。于是又有人提出了 Result<T, E: Error>
来指定错误类型,大部分情况下你会在这里定义一个 enum 来穷举所有可能的错误(注意这里的错误是 Error
而非 Swift.Error
)。喵神在文中详细对比了这两种方式的利弊。
当然,官方不可能对这一不足置之不理,相关的提案 SE-0235: Add Result to the Standard Library 本周已经在讨论中,相信结果很快就会出来,让我们拭目以待。
🐢 KVC/KVO 总结
对 KVC / KVO 做了到位的总结和代码示例。相信对想要详细了解或使用 KVC / KVO 的同学会有所帮助。
KVC
- Key-Value Coding基本原则
- 访问对象属性
- 访问集合属性
- 访问者搜索模式
KVO
- 注册KVO
- 兼容KVO
- 注册从属keys
- Key-Value Observing 的实现细节
🐢 Category 特性在 iOS 组件化中的应用与管控
关于组件化,在业界的文章和讨论已经很多了。但组件化其实是一个比较大的工程化问题,对于想要使用和已经采用组件化进行开发的团队来说,对于实施组件化的很多细节,其实很多文章并没有说的很清晰。本文主要围绕组件分层通信解耦的机制,先后列举了常见的几种方案对比,以及美团所采用的方案:Category+NSInvocation 和 CategoryCoverOrigin。对于这两个相对陌生一些的方案,文中也有一定的介绍,并且写了实际运用的代码,对此有兴趣的同学推荐可以认真看一下本文。最后,Category 的使用笔者一向认为需要比较慎重,否则往往会带来更坏的效果,至于采用哪种方案,就看大家自己的抉择了。这里并没有打太极的意思,而是对于组件分层通信,怎么做、是否要做到如此,以及各种方案所带来的代码量的增加和后期的维护成本是否值得,不同的团队也会有不同的见解。
🐕 Void
NSHipster 介绍了很多和 Nothingness 相关的内容。这篇文章主要介绍的是 Swift 中的 Void。文章内容依旧是 Mattt 大神的写作三部曲:
-
Void 在标准库中的运用
描述了 Swift 标准库在设计 ExpressibleByNilLiteral 的时候,如何巧妙的运用 Void 避免了和默认 init 冲突的情况。
-
Void 一些被忽略的细节
比如 Void 是一个 non-nominal 类型,如何在无法拓展的情况下如何相互比较、一些自相矛盾的写法等
-
Void 实际开发中的秒用
以网络请求为例,在使用 Void 的情况下,巧妙的把
completion(.success(()))
改成了completion(.success)
🐎 Swift Tip: Lightweight Observation
对于静态视图结构和动态数据,我们可以使用内建的 didSet
属性观察器来观察数据的变更,并对应更新视图。这项技术的优势就在于简单性:不需要引入响应式框架、KVO 或其他东西。这篇文章用一个实际的例子演示了具体的做法。
🐕 Swift 5 and ABI stability
Swift 5 的分支最近已经准备要合并到主干了,这一次合并意味着 ABI 在 Release 之前不会有大改动,并且在未来版本保持 ABI 的向后兼容性。
所以最近在 Swift 论坛上也能看到核心团队加快节奏在调整精简标准库的 API,包括加入 Contiguous Collection Protocols 确立数组内存布局以便优化排序等操作,去除掉 Sequence.SubSequence 以便提升数组切片效率等等。
如果你还不了解 ABI 相关的内容,那么可以看看这篇文章,了解一下 ABI 稳定对我们日常开发的影响。
🐢 【译】给 iOS 开发者介绍 Flutter
本文是 Flutter for iOS 官方指南的翻译。iOS 知识和技能对 Flutter 开发非常有价值,如果你已经有 iOS 开发经验,可以通过这篇文章,用自己已有的 iOS 知识去使用 Flutter 构建应用。
文章主要介绍 UIView、UIViewController 等 iOS 常见知识在 Flutter 中怎样使用。共包含 12 个章节:View、页面导航、线程和异步、工程结构/本地化/依赖和资源、ViewController、布局、手势检测和 Touch 事件处理、主题和文字、表单输入、与硬件交互/第三方服务和平台、数据库和本地存储、通知。
作为给 iOS 开发者的入门 Flutter 的文章,本文内容全面,也可以作为开发手册来查阅。另外,作者还翻译了 给 Android 开发者介绍 Flutter,有兴趣可以阅读。
设计
Photopea: advanced image editor
Photopea 是一款免费的在线 Photoshop(替代品),拥有和 PS 几乎相同的界面和快捷键,并且支持多语言,已经有超过 150 万独立访客。
工具
手机上的抓包神器 Stream
配置简单,不需要改代理等繁琐操作,即可
-
抓取手机上的 HTTP & HTTPS 请求和响应,方便开发和测试人员快速定位线上问题。
-
重放和构建请求,高效调试服务端接口。
-
支持在 iOS 上实现配置 Hosts 的效果,方便产品和测试切换线上和测试环境。
-
集成一些常用工具,如 URL Decode/Encode,md5,base64,时间戳转化等。
另一款轻量级的 UI 实时调试工具 - Sherlock
这是除 Reveal 外又一款支持实时调试 UI 的工具,相比于 Reveal,Sherlock 虽然没有 Reveal 那么强大的功能,但它更加轻量级,且无需任何配置,打开模拟器和 Sherlock 就可以直接使用。此外,它还支持调整屏幕大小以测试你的 UI 在各类屏幕上的展示效果,不需要你去启动各种模拟器。目前 Sherlock 正处于 Beta 测试中,暂时只支持 iPhone 模拟器。
SmartBaby
SmartBaby 是一款提高 Swift 开发者效率的工具。它能从 JSON 推断出 Codable 模型,且具有好用的自定义功能。创建的模型可按照 Project 分组,并使用 CloudKit 存储在 iCloud 的私有数据库中。
由 SmartBaby 开发者 @nixzhu 自荐
代码
AloeStackView
AloeStackView 是一个类似垂直 UITableView 的类。它着重于让 UI 的实现变得非常的快速、简单和直接。不过为了实现更简单、更安全的API,它放弃了 UITababieView 的一些特性,如视图循环。
特性
- 允许您保持对视图的强引用并动态更改其属性,而自动布局让 UI 实时更新。
- 允许视图动态添加、删除、隐藏和显示,并提供可选动画。
- 包括对视图间可定制分隔符的内置支持。
- 提供可扩展的 API ,允许添加专用功能而无需修改 AloeStackView 本身。
- 在高流量的 iOS 应用程序中广泛使用和审查。
- 小的、易于理解的代码库(在500行代码之下)没有外部依赖性,调试轻松。
音视频
LEARN TALKS AWESOME CONFERENCE AND MEETUP TALK
顾名思义,learntalks 是一个学习如何 talk 的网站,面向技术人员。网站收录了技术领域时下热门的技术大会的演讲视频,其语言涵盖了 Swift,Kotlin, Javascript 等,颇有一种足不出户就能阅遍天下大会的感觉,学技术和学 talk 同时进行。推荐关注。
Flutter 免费视频教程第一季:开发环境搭建
手把手带你配置 Flutter 开发环境的视频教程,除视频外作者还编写了非常详尽的文字教程,对正在入坑 Flutter 的小伙伴可以看看。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解更多公司及岗位信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
关注我们
我们开通了公众号,每期发布时公众号会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github...