# 老司機 iOS 週報 #44 | 2018-11-19
老司機 iOS 週報,只為你呈現有價值的資訊。
你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 SwiftOldDriver%2FiOS-Weekly%2Fissues" rel="nofollow,noindex">Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。
文章
本文作者通過一個例項演示來介紹他們團隊寫的單向資料流應用框架 ReactiveFeedback" rel="nofollow,noindex">ReactiveFeedback 。由於作者所在團隊用的是 ReactiveCocoa
,所以他們就基於 ReactiveSwift
自己實現了一套類似 RxFeedback
的框架。
雖然是教程類的文章,而且還是寫自家框架的,但是閱讀本文還是會有三層收穫:
- To 普通開發,瞭解應用開發還能這麼玩。如果大家對
Redux
,ReSwift
,RxFeedback
這些比較熟悉的話,文中介紹的框架結構和用法還是很好理解的。即使不熟悉,認真看也是能懂的,因為文章寫得真是超級詳細; - To 框架維護,理解他們做類似架構演進的思路。單向資料流應用框架的可維護、可預測以及可測試性等這些特點可以較好地解決一個複雜應用工程會面臨的臃腫混亂難以管理的問題。文中也提到
ReactiveFeedback
沒有設計全域性的應用狀態,但是每個功能模組與外部互動時都有明確的主入口,內部只有自己獨立的狀態,使用起來非常簡單靈活和方便; - To 技術管理,通過技術手段來提高工程質量和效率是非常有意義的,特別是大家一起維護一套開發框架。能對應用架構和程式設計模式不斷地進行探索,也是工程師文化的很好體現。經常做這類技術輸出的團隊肯定也是大部分人所向往的有技術氛圍的團隊。
Docker 作為近幾年來服務端最重要的技術創新之一,解決了無數配置與運維的噩夢。而另一邊,Server-side Swift 的蓬勃發展,似乎和 Docker 擁抱已經是一個必然。本文既是一篇非常棒的 docker 入門文章,用很簡潔的篇幅講了 docker 是什麼,能做什麼,並且給出了相應的學習路徑,同時,也是一篇介紹如何使用 docker 技術來提升 Server-side Swift 的開發與配置效率的文章。作者生動的介紹瞭如何製作 Swift 的 docker image,如何實時修改 docker image 中的程式碼,最後還提出基於 docker compose 來實現基於 Vapor 的微服務架構,非常酷! 推薦大家閱讀。
:construction: :dog2: Assertions in Production
作者圍繞斷言的使用展開了以下探討:
-
如何上報斷言(Assertion)?
首先作者分享了將斷言上報的程式碼片段。作者認為相較於 Property Testing(性質測試),斷言等於真正的使用者產生的 Property Testing,更加隨機、多樣和不可預測,而且不需要寫任何測試用例。
-
何時加斷言?
作者一般的規則是,在沒有
else
的情況下,應該加斷言。以下情況下也會加斷言:確保方法傳參正確的時候;從字典裡用已知的 key 取值的時候(如NSNotification``userInfo
);確保必須在主執行緒進行的操作當前是否在主執行緒的時候;開啟關鍵的資料庫或者檔案失敗的時候。 -
對於線上的產品,是否應該讓斷言處 Crash?
作者認為沒有必要。斷言可以當做錯誤上報,但不應該造成閃退。
Race condition, 即競爭條件。我們都知道,當多個執行緒同時訪問相同的資源,就可能會出現意想不到的問題。對此,執行緒安全一直是開發中需要額外關注的一個問題。本文講了在 Swift 中,race condition 可能存在的場景,以及在平時的編碼中,如何儘可能避免這種問題。
Swift Metatypes
,可能每天都在用,卻很難解釋清楚到底是什麼東西,Apple 文件對此描述也比較晦澀,只說 type of a type
。
文章從最簡單的 String
開始,講 String.Type
、 string.self
之間的關係,串起 .Type
.self
type(of:)
Protocol
,最後還介紹了一些 Metatypes
使用場景。
本文系列文章第一部分,作者希望將 React/ReactNative
中的主要程式設計思想,應用在 Swift
中,以此提高提升開發效率和程式碼質量。作者認為 React
的核心概念為,將資料轉化成檢視描述資料,也就是 Data
到 React Element
的過程。在這個過程中,無形中引入了單向資料流,提升了程式碼的規範性和開發效率。文中介紹瞭如何用 Swift
實現 Componet, Element, Node
這幾個關鍵部分。
相對於 Objective-C
來說,Swift 沒有 Runtime
不能實現類似 swizzing
功能。但得益於 Mirror
的 反射
功能,我們可以得到物件資訊的只讀訪問, Playground
就是 Mirror
的一個主要場景。文章介紹了 Mirror
及相關的 CustomReflectable
CustomLeafReflectable
兩個 protocol
使用細節。
:dog2:分析實現-倒計時設計
倒計時器是一個日常開發中很常見的需求,通過 NSTimer
、 GCD
或者 CADisplayLink
都可以輕易實現。本文作者在看到一個基於 NSOperation
的全域性計時器方案後,引發瞭如何完成一個更高效、介面設計更合理的倒計時器輪子的思考。從選擇儲存結構出發,到最後的邏輯封裝,作者一步步完成了自己的倒計時器。
雖然是一個很小的需求,但卻很考驗開發人員的編碼能力,希望各位讀者都能夠從作者這種軟體設計思維中有所得。
閒魚團隊的新文章,他們算是最早用上 Flutter 重寫自己 App 的大廠團隊,趟過的坑一定不會少,也值得其他人學習經驗。
Flutter 最近也在各個國內大廠掀起了應用浪潮,如果有打算應用 Flutter 或者是已經在嘗試應用 Flutter 的同學們,不妨考慮先讀一讀閒魚團隊的系列文章,可以讓你少踩很多坑。本文就介紹了閒魚團隊在專案中嵌入 Native 程式碼的做法和背後的原始碼中的原理,雖然 iOS 中還暫時沒有出現和 AndroidView 對應的控制元件,但是相信之後一定會有對應的控制元件跟上。目前在 Android 端有需求的同學們不妨先學習參考。
本文介紹了我們熟悉的 Playground
,它通過 PlaygroundLogger
框架來實現實時反饋。文章前半部分花了大篇幅介紹這個框架支援展現的型別和 CustomPlaygroundDisplayConvertible
協議的用法。文章後半部分則從 Playground
自身的特殊性展開,總結了 CustomPlaygroundDisplayConvertible
跟 CustomStringConvertible
、 CustomDebugStringConvertible
以及 Debug Quick Look
之間的關係。讀完全文,不僅能讓我們知道了 CustomPlaygroundDisplayConvertible
怎麼用的,而且也清楚了它的具體使用場景。
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 的好處。
支付寶 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 中找到它,但是還是建議你先讀一讀這篇文章。
音視訊
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 訂閱: github.com/SwiftOldDri… 。