老司機 iOS 週報 #34 | 2018-09-03

老司機iOS週報發表於2018-09-03

為了提高大家分享高質量的文章給我們的積極性,我們做出了一點小改變。如果文章是讀者推薦給我們的,我們會在文章的點評後面宣告推薦人,可以帶一條推薦人的連結(部落格,微博都可以)。具體瞭解可以看這裡:對提高讀者反饋技術文章熱情的一點嘗試。歡迎大家到 Issues 裡多多推薦有價值的資訊、文章、工具等可以提給我們。

新聞

iPhone 8 主機板更換計劃

Apple 已經確定,極少數 iPhone 8 裝置的主機板存在製造缺陷。受影響的裝置可能會出現意外重新啟動、螢幕當機或無法開機。Apple 將會免費維修符合條件的裝置。受影響的裝置是在 2017 年 9 月至 2018 年 3 月期間售出,銷售範圍覆蓋澳大利亞、中國內地、香港特別行政區、印度、日本、澳門特別行政區、紐西蘭和美國。可以去本篇連結進行序列號查詢,從而判斷你的 iPhone 8 是否在更換計劃範圍內。

文章

? [譯] 在 Codable 中實踐型別推斷

型別推斷是 Swift 型別安全的一個強大特性。本文介紹了利用型別推斷來優化 Codable API。看完文章後對型別推斷的運用場景會有更好的理解。

? 手把手教你檢視和分析 iOS 的 crash 崩潰異常

我們開發的 App 不可避免會出現閃退,可以通過整合一些第三方的閃退收集系統或 iTunesConnect 自身來收集閃退日誌。有了閃退日誌之後,並不是所有閃退都能快速的定位解決,特別是沒有明確上下文或者沒有一個函式或者方法能夠被直接定位到原始碼的場景,本文介紹面對這類閃退的幾種可行辦法,特別是通過暫存器及彙編程式碼來定位問題。

? ? ? Why Monads?

瞭解過函數語言程式設計的同學多多少少應該都聽說過 Monad 這個異常鬼畜概念,似乎從來沒有一篇文章能用人話把這個概念說明白,比如學理論的同學會說 Monad 是自函子範疇上的么半群,Haskell 程式設計師同學會說如果我們能為一個 type 定義 bind 和 return,那這個 type 就是一個 Monad,而 Swift 程式設計師一般則認為能被 flatMap 的類就是一個 Monad。那叫一個熱鬧。其實都不能算錯,畢竟每個語言的表現能力不同。

本篇文章嘗試從 monoid 開始,使用 Swift 的語言來更嚴謹的介紹什麼是 Monad 以及我們為什麼會需要他,寫得非常棒。既最大限度的還原了學術層面的定義,但又切實的使用 Swift 來實現並結合了實際的例子,是不可多得的好文,適合對函數語言程式設計有興趣的同學研究閱讀。

文章還有一大亮點就是,一針見血指出了函數語言程式設計普及的最大難點:如果使用 inductive 的方式,從簡單的實踐出發來學習函數語言程式設計,會發現其實有很多替代方案,很容易質疑 FP 的意義,而另一方面,deductive 的方式,也就是從理論出發落地到實踐,卻又面臨比較陡峭的理論學習曲線。作者深信學好 FP,live with them, 對一個人的程式設計思路和方法會有極大的增益,所以在嘗試中和理論和實踐的方式來做 Monad 的介紹,從這篇文章上看他也的確做到了,真心為 Swift 能有這樣的開發者高興。

從本文的專業程度、對理論的還原程度以及對 Swift 語言特性的挖掘這些方面來看,基本可以標誌著 Swift 進入主流函數語言程式設計語言的陣營,未來和 Scala,Haskell,OCaml 等競品同臺飆戲的日子指日可待。最後就摘選一句作者原文中的句子作為結尾:I hope I was able to shed some light on why, once upon a time, someone even considered applying mathematical concepts like monads to programming, and on why these structure are useful in solving practical programming problems: now it’s up to the reader to consider taking this leap.

? ? Google Swift Style Guide 濃縮版

谷歌版的 Swift Style Guide 是現在公開的 guide 裡實用價值最高的一篇。每一個使用 Swift 的開發者看完應該都會有所收穫。於此同時我也翻譯了官方 Swift API 設計規範,對規範感興趣的朋友也可以一起閱讀。

? Improving Your Build Time in Xcode 10

今年 WWDC 上 Session 408 的主題是 Xcode 中如何提升編譯速度,視訊連結在此。強烈建議在實際專案中忍受緩慢的編譯速度之苦的同學們花費一點時間看一下。

而這篇文章總結了 Session 408 ,對於沒有時間好好過一遍視訊的同學來說,是個不錯的學習資料。

? Dynamic Features in Swift

在大家印象中,Swift 一直是以靜態語言、型別安全、編譯器檢查等特點而為人所熟知的,事實上也正是因為這些 OC 無法實現的優點,蘋果才會願意在 OC 之外另起一門新的語言並大力推廣。但是這不代表 Swift 只能是靜態的,只要有簡潔的語法和儘可能安全的呼叫方式,Swift 也能擁有一些動態特性。作為 iOS 工程師們的老朋友,Raywenderlich 的這篇文章分別介紹了 Swift 中的一些動態特性,包括 Mirror、KeyPath 和 KVO,甚至還有 Swift 4.2 中的新特性 @dynamicMemberLookup,使開發者們在享受 Swift 型別安全的同時,能有更多的選擇去完成一些更靈活的需求。

? 在 ARKit 中建立一個時空門 App

本文譯自 Ray Wenderlich《ARKit by Tutorials》一書免費釋出的 7、8、9 三個章節,向你展示瞭如何利用 ARKit 構建一個沉浸式的時空門 app。時空門 app 是指在現實世界的地面上放置一個通往另一個房間的虛擬門,可以走進走出這個房間,探索其中的內容。

本文由譯者史前圖騰推薦。

? iOS 的高效能、高實時性 key-value 持久化元件

FastKV 是本文作者參考微信團隊的 MMKV 實現的一個 key-value 元件。底層同樣使用的是 mmap,上層資料序列化為了不依賴 protobuf 自己實現了一套。mmap 純讀寫效能的確要比 NSUserDefaults 高,但是 mmap 也有它的侷限性,它需要整數倍的物理頁大小(page_size),並且也需要連續的記憶體區域,同時還需要自己實現對映關係、維護資料結構和異常處理。這相當於提高效能的額外成本,如同作者本人在文末說的 “如果對實時性要求不高的專案,建議還是使用官方的 NSUserDefaults”。有興趣的同學可以跟作者一起維護這個元件,或者自己動手學習和實現一個類似的 key-vale 元件。

? Life of a Pixel 2018

Steve Kobes 做的 Life of pixels 2018,講了如何從一個 HTML 檔案到螢幕上顯示。前端或者對排版有興趣的同學推薦看一下。從 Dom 到 Display,這中間是一個很複雜的過程。解析、排版、渲染,每一個環節下的結構設計、與 GPU 的協同工作等分享中都有提到。這可以讓我們對 Chromium 的頁面展示有一個大體的瞭解,有視屏不用讀文字,看起來也會比較輕鬆一些。分享用到的 PPT 的連線

? When You Refactor, Are You Using Small Steps ?

文中提出重構採取較小步驟原則( Take smaller steps ),作者貼出了他將佔位符文字的從 ViewController 轉移到 ViewModel 的例子來講述整個最小步驟重構過程。並提出一個非常好結論:真正的重構是逐步進行的,並且每個步驟都通過單元測試進行驗證。相信文字對你在重構的認識上會有所幫助。

? 閒聊 Flutter

跨平臺一直是大家前赴後繼不斷追求的目標,原本 web 作為跨平臺的解決方案很完美,但歷史程式碼的相容、CSS 過於複雜、DOM 介面粒度大等問題,造成 Web 技術下的跨平臺方案有較明顯的效能問題。而 Flutter 基於一個精簡版的 web 引擎,拋棄相容性,只保留主要功能,效能較前者快了不少。雖然 Flutter 還有包大小、缺乏動態性等問題,但一個完整的比 webkit 簡單的多的引擎,原始碼很值得挖掘學習。

? Enum iterations in Swift 4.2

Swift 4.2 為我們帶來了全新 CaseIterable 協議,讓我們可以快速地取到一個 Enum 中所有的 case。比 Codable 更方便的是,你可以直接擴充套件已存在的 Enum。文中的 Enum maps 一節為我們展現了很有趣的 CaseIterable 的用法,很快你也會愛上這個新協議的。

? dyld_link & loaddyld_startup 解析

這兩篇文章系統、全面地從原始碼級別探索 dyld 裝載、連結、自舉等工程。文章針對原本過程進行過濾,抓大放小,簡單、明瞭地把原理闡述出來,並把簡化後的虛擬碼貼出,可讀性非常高。

本篇收錄由該文作者 @mrriddler 自薦。

? TCP沒那麼難吧?

本文詳細講述了TCP 的握手和揮手流程,幫助大家更好地理解並掌握可靠性高的網路協議設計流程

  1. TCP 建立連線本身其實需要4次過程(客戶端請求,伺服器確認,伺服器請求,客戶端確認),在合併了第2、3步以後,就變成了我們現在熟知的3步走流程
  2. TCP 狀態機將能幫助我們更好地瞭解,在建立連線過程中的各種異常狀態流轉過程,通過狀態機模型能夠很直觀地表達複雜流程的各種細節
  3. TCP 終止連線顯然也是需要4次流程(客戶端終止,伺服器確認,伺服器終止,伺服器確認),然而在這個流程下,第2、3步並不能合併

最後推薦兩本書《Wireshark網路分析就這麼簡單》《Wireshark網路分析的藝術》。書的作者藉助 Wireshark 這個“神器”,深入開發中的各種疑難雜症,剝繭抽絲,娓娓道來,是瞭解計算機網路程式設計非常好的參考書。

? NSDataAsset

我們經常使用 Asset 來儲存 @2x、@3x 的圖片資源,這樣可以利用 app thinning,在不同的裝置上之後打包進對應的資原始檔。從 iOS 9 開始,Asset 不僅支援圖片資源,也支援 data 格式。本文演示瞭如何使用 NSDataAsset。

? Xcode 10 Storyboard Changes

Xcode 10 快要釋出正式版本了,所以有必要了解一下新的改動。這篇文章沒有列舉所有的改動,主要列舉了 Interface Builder 介面的一些改動,具體如下:

  • 浮動的 Library, 控制元件和資源的視窗不再依附在右下角,而是變成了一個浮動的視窗。
  • 多功能的 Embed in 按鈕,主要是替代原來的 stackview 的按鈕,同時也新增了 Embed ViewControllers 的功能

當然,Xcode 10 還有很多其他的更新的改動,感興趣的可以看一下 What’s New in Xcode

? Objective-C: 寫一份可測試的程式碼

本文介紹瞭如何編寫一份可測試的程式碼。主要闡述了依賴注入,最小知識原則在編寫可測試性程式碼中扮演的角色,如何運用好它們來寫出可讀性和可測試性並存的程式碼。

? UI 自動化測試:通過 Appium 加速你的客戶端 UI 測試

這篇文章介紹瞭如何使用 Appium 編寫一個完整的 UI 測試用例,Appium 是一個開源的 UI 測試框架,通過給外部暴露出一套完整的 REST API 去完成測試操作,支援 iOS 和 Android,使用 Appium 編寫測試時有多種語言可以選擇,例如 Ruby,Python 等等。

工具

Mermaid,一個生成結構圖的工具

文章介紹了一個名叫 Mermaid 的軟體,可以直接通過一定的語法來書寫流程圖的架構,簡直是為程式設計師量身打造,目前支援流程圖、序列圖和甘特圖(想起了手畫流程圖的那些蛋疼的日子)。不僅如此,Mermaid 還支援直接和 Gitbook 整合,而且因為本身 Mermaid 是以 SVG 檔案輸出的,所以和其他的 Web 場景也可以很好地相容。

軟體是好軟體,不過這篇介紹文章有點過於簡單,建議大家直接去官方地址檢視學習。

程式碼

基於 ARKit 的 iOS 無限屏實現,還原錘子釋出會效果

作者通過在越獄環境下修改 SpringBoard.app,並通過 ARKit 的慣導演算法來獲取手機的相對位移,然後渲染一個遠大於手機螢幕的虛擬空間,從而實現了 iOS 桌面的無限屏模式,使得在視口發生位移時,產生在無限屏上游歷的效果。即使沒有越獄環境也沒有關係,本文也適用於修改自己的 app,比如實現一個可以左右、上下翻閱的地圖、PDF 閱讀器等。

《iOS 面試之道》電子版

紙質書上線一個多月以來頗受歡迎,現在電子版正式開始發售,目前五折。喜愛電子版的朋友現在是入手最佳時機。

內推

關注我們

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

老司機 iOS 週報 #34 | 2018-09-03

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

本期編輯

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

說明

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

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

相關文章