老司機 iOS 週報 #42 | 2018-11-05

老司機iOS週報發表於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 作者都非常喜歡這個功能)。還能序列或並行,使用鏈式呼叫進行多個請求,並對結果進行統一處理。

內推

關注我們

我們開通了公眾號,每期釋出時公眾號會推送訊息,歡迎關注。

老司機 iOS 週報 #42 | 2018-11-05

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

本期編輯

@四娘@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驢@小非86@紅紙@含笑飲砒霜@JimQ

說明

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

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

相關文章