老司機 iOS 週報 #44 | 2018-11-19

老司機iOS週報發表於2019-03-04

老司機 iOS 週報,只為你呈現有價值的資訊。

你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 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.Typestring.self 之間的關係,串起 .Type .self type(of:) Protocol,最後還介紹了一些 Metatypes 使用場景。

? 用 Swift 解讀 React/React Native: Part 1 - React Element & React Component

本文系列文章第一部分,作者希望將 React/ReactNative 中的主要程式設計思想,應用在 Swift 中,以此提高提升開發效率和程式碼質量。作者認為 React 的核心概念為,將資料轉化成檢視描述資料,也就是 DataReact Element 的過程。在這個過程中,無形中引入了單向資料流,提升了程式碼的規範性和開發效率。文中介紹瞭如何用 Swift 實現 Componet, Element, Node 這幾個關鍵部分。

? Mirror / Custom​Reflectable / Custom​Leaf​Reflectable

相對於 Objective-C 來說,Swift 沒有 Runtime 不能實現類似 swizzing 功能。但得益於 Mirror反射功能,我們可以得到物件資訊的只讀訪問,Playground 就是 Mirror 的一個主要場景。文章介紹了 Mirror 及相關的 Custom​Reflectable Custom​Leaf​Reflectable 兩個 protocol 使用細節。

? 分析實現-倒數計時設計

倒數計時器是一個日常開發中很常見的需求,通過 NSTimerGCD 或者 CADisplayLink 都可以輕易實現。本文作者在看到一個基於 NSOperation 的全域性計時器方案後,引發瞭如何完成一個更高效、介面設計更合理的倒數計時器輪子的思考。從選擇儲存結構出發,到最後的邏輯封裝,作者一步步完成了自己的倒數計時器。

雖然是一個很小的需求,但卻很考驗開發人員的編碼能力,希望各位讀者都能夠從作者這種軟體設計思維中有所得。

? 在 Flutter 中嵌入 Native 元件的正確姿勢是...

閒魚團隊的新文章,他們算是最早用上 Flutter 重寫自己 App 的大廠團隊,趟過的坑一定不會少,也值得其他人學習經驗。

Flutter 最近也在各個國內大廠掀起了應用浪潮,如果有打算應用 Flutter 或者是已經在嘗試應用 Flutter 的同學們,不妨考慮先讀一讀閒魚團隊的系列文章,可以讓你少踩很多坑。本文就介紹了閒魚團隊在專案中嵌入 Native 程式碼的做法和背後的原始碼中的原理,雖然 iOS 中還暫時沒有出現和 AndroidView 對應的控制元件,但是相信之後一定會有對應的控制元件跟上。目前在 Android 端有需求的同學們不妨先學習參考。

? Custom​Playground​Display​Convertible

本文介紹了我們熟悉的 Playground,它通過 PlaygroundLogger 框架來實現實時反饋。文章前半部分花了大篇幅介紹這個框架支援展現的型別和 Custom​Playground​Display​Convertible 協議的用法。文章後半部分則從 Playground 自身的特殊性展開,總結了 Custom​Playground​Display​ConvertibleCustomStringConvertibleCustomDebugStringConvertible 以及 Debug Quick Look 之間的關係。讀完全文,不僅能讓我們知道了 Custom​Playground​Display​Convertible 怎麼用的,而且也清楚了它的具體使用場景。

? 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 週報 #44 | 2018-11-19

同時也支援了 RSS 訂閱:github.com/SwiftOldDri…

本期編輯

@四娘@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7@方秋枋@kyo@tom510230@anotheren@水水@looping@老老老老老老老驢@小非86@邦ben@紅紙@含笑飲砒霜@JimQ

說明

? 表示需翻牆,? 表示編輯推薦

預計閱讀時間:? 很快就能讀完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)

相關文章