老司機 iOS 週報 #33 | 2018-08-27

老司機iOS週報發表於2018-08-27

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

你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。

文章

? Easier Scrolling With Layout Guides

iOS 11 為 UIScrollview 增加了新的 layout guide:frameLayoutGuidecontentLayoutGuide,目的在於讓 scroll view 的 constraints 設定變得更加直觀,這篇文章會為你實際展示如何使用它們。

? Model controllers in Swift

如何封裝 Model 相關的邏輯是保持程式碼高可維護性的關鍵之一,通常來說,設計優良的型別定義通常奠定了一個好架構的基礎。作者介紹瞭如何通過建立一個 ModelController 類,將 Model 層相關邏輯封裝其中,只暴露需要外界瞭解的一部分介面,相信會給大家一些啟發。

? Atomic Properties in Swift

Swift 語言沒有定義原子屬性的功能,但 atomic 內部也是通過自旋鎖保證的 set、get 方法的原子性,Swift 中我們也能使用鎖來實現屬性的原子性,除了鎖,使用佇列也能達到同樣的效果。

? Swift Property Observers

文章詳細介紹了 Swift 中的屬性觀察器,並通過兩個例子來深入淺出地說明屬性觀察器適用的場景。如果你剛入門 Swift ,值得一讀。

? Hook 所有 +load 方法(包括 Category)Hook static initializers

在做 App 啟動時間的深度效能優化時,我們會對 pre-main 階段的耗時進行統計(如需更系統瞭解這部分,可參考 29 期週報中推薦的『App 啟動時間優化』一文),其中統計所有 +load 方法以及 static initializers 的耗時就是很重要的一部分。everettjf 的這兩篇文章分別闡述瞭如何進行這類耗時的統計。

? Examples of NSPredicate usage

NSPredicate (謂詞)類是用來定義邏輯條件約束的獲取或記憶體中的過濾搜尋。可以使用謂詞來表示邏輯條件,用於描述物件永續性儲存在記憶體中的物件過濾。作者詳細的列出了 NSPredicate 的各種使用示例。是 NSPredicate 使用者的不錯參考文章。

? ?The difference between Flux and Redux

使用 React 或者 ReactNative 的朋友們在開發中都接觸過元件與元件之間的狀態管理與資料傳遞。傳統的通過 props 層層傳遞,在面對元件複雜互相巢狀等情況下就顯得開發困難不利於維護。因此產生了狀態管理的工具 Flux 後續又發展出來了 Redux。這篇文章就詳細的為我們介紹了 Flux 與 Redux 的一些設計上的區別。

? Let's Talk Architecture

iOS 的應用架構實際上是一個老生常談的問題。相比於各種打太極的文章,本文從 iOS 應用架構的前世今生,詳細講解了 MVC、MVVM、MVP 在 iOS 上的使用以及他們各自的優缺點。並將 MVC 劃分為過去,將 MVVM 和 MVP 劃分為現在,而至於未來,作者也給出了自己的答案,函數語言程式設計。當然,筆者認為,我們在真正開發中,具體要選擇哪種架構最好還是要切合團隊專案的實際情況。就像作者在文章末尾也有提到,這些框架都可以幫助我們實現相同的目標,也就是編寫優秀的軟體。

? [譯]構建流暢的互動介面

今年 iOS 花了很大的功夫在優化系統基礎體驗上,甚至在 WWDC 裡專門開一個 session 來講如何構建流暢的人機互動。這篇文章的作者在看了這個 session 之後有感而發寫了這篇文章,在介紹和總結 session 內容的同時,還動手通過程式碼實現了那些 Design Tips,裡面特定互動的最佳實現和動畫實現的思路都非常棒,推薦一看。

-- #31 構建流暢的人機互動

31 期裡提到的文章構建流暢的人機互動通過掘金計劃進行了翻譯,如果是因為英文而錯過了這篇文章的朋友,這次可以毫無負擔地進行閱讀了。

工具

統計 CocoaPod 元件大小的工具集

這是一款用來計算把 CocoaPod 庫打成二進位制後的大小的工具。實現思路很簡單,就是搞兩個一樣的殼工程,把其中一個通過 pod 安裝好類庫,再 archive 兩個工程,最後計算差值。這種測量方式通常會在持續整合平臺上用來自動計算每次發版包大小的變化。從文件描述中得知,實際安裝大小會比使用該工具計算的大小多 3% 左右。試用下來的體驗還是不錯的,但也有很大的改進空間。還沒有開始做安裝包或 SDK 大小變化統計的同學可以開始搞起來了。

程式碼

Schedule

Schedule 是一個輕量級的定時任務框架,提供了許多友好語法供開發者執行定時任務。 我們可以從下面這行程式碼一窺這個庫的用法。

Schedule.every(.monday, .tuesday).at("9:00:00").do { }
複製程式碼

DifferenceKit

繼上次推薦的 DeepDiff 之後,又一個計算兩個列表的 Diff 差異的庫,目前 iOS 大部分 Diff 庫的靈感都來自於 IGListKit,因為 IGListKit 採用了一個 O(n) 的演算法來尋找兩個列表的不同,相比較於 DeepDiff 的動態規劃尋找最短路徑演算法,有明顯的效能提升。DifferenceKit 最值得推薦的一點就是 API 相比較而言更為豐富。但是,相比較於使用,我更推薦大家看一下原始碼或者學習一下這些 Diff 庫的實現演算法 Paul Heckel's Diff Algorithm

Validated

Validated 是一個同時處理多重錯誤的庫,用於簡化需要多次驗證資料正確性的程式碼。

Validated 框架融合了之前一些已有的概念,例如 Result

我們也可以從以下幾個樣例程式碼中一探究竟:

let user = try validateUser(id: 1, email: "blob@pointfree.co", name: "")
// throws Invalid.error("name can't be blank")

func validate(id: Int) -> Validated<Int, String> {
  return id > 0
    ? .valid(id)
    : .error("id must be greater than zero")
}

let validInputs = zip(
  validate(id: 1),
  validate(email: "blob@pointfree.co"),
  validate(name: "Blob")
)
// Validated<(Int, String, String), String>

zip(with: User.init)(
  validate(id: -1),
  validate(email: "blobpointfree.co"),
  validate(name: "")
)
// invalid([
//   "id must be greater than zero",
//   "email must be valid",
//   "name can't be blank"
// ])
複製程式碼

內推

關注我們

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

老司機 iOS 週報 #33 | 2018-08-27

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

本期編輯

@沒故事的卓同學@四娘@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7@方秋枋kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驢

說明

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

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

相關文章