老司機 iOS 週報 #48 | 2018-12-17

老司機iOS週報發表於2018-12-17

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

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

福利

? 我們發福利啦~

週報已經快陪伴大家走過一年的時間,非常感謝各位朋友的支援和厚愛。為了在 2019 年能更好地為大家服務,我們舉辦了一個問卷調查活動。在 12 月 27 日,我們會在參與問卷的朋友中選取合適的幾個人贈與學習大禮包和現金獎。至於獎品是什麼,大家可以在這條微博中瞭解,轉發還有額外的抽獎~我們渴望聽到你們的聲音!

新聞

2018 App Store 年度頒獎典禮

Apple 的年度 app 精選又出爐了,為了介紹和表彰獲選 app,這是 App Store 和 Apple 官方微信聯合呈獻的 2018 App Store 年度頒獎典禮,歡迎圍觀下載。

Perfect 4 將會使用 SwiftNIO

SwiftNIO 是一個跨平臺、非同步、事件驅動的網路應用框架,可用於快速開發和維護高效能的網路協議伺服器和客戶端。對比同樣是 Swift 服務端的框架的 Vapor,已在今天 5 月釋出的 Vapor 3 中全面使用了該框架。當然作為一個底層框架,你一般不會直接和它打交道。

文章

? ? 解密 Runloop

很顯然,Runloop 是一個很熟悉的名詞,熟悉到每次面試都會碰到有人問你,請說說你對 Runloop 的理解。Runloop 是開源的,因此本文作者通過精簡後的原始碼示例來解釋 Runloop 的基本執行順序。

  • 基本流程:迴圈執行(執行任務->通知外部->休眠)。
  • Runloop 依賴 mach_msg 進行程式間通訊,也就是訊息接收傳送。
  • Runloop 裡面會執行 source0(可呼叫 CFRunLoopAddSource 建立),source1(僅系統呼叫)。
  • Runloop 會執行5類任務 timer, mainQueue, source0, source1, block
  • Runloop 通過註冊 observer 的方式來通知外部當前的任務執行狀態,而5類任務中 mainQueue,source1,block 不支援註冊 observer,也就是你無法通過 obsever 來得到準確的執行時間。
  • RunloopActivity 也是通過 observer 來通知外部當前處於哪個 Activity,當 source0 被執行的情況下,kCFRunLoopBeforeWaitingkCFRunLoopAfterWaiting 會被跳過,意味著單純通過對 Activity 的回撥進行分析業務程式碼的執行狀態是不可靠的。
  • Runloop mode 分為 common modeprivate mode,作者通過捕獲 mode 得到了很多陌生的 private mode,分別用來處理不同的場景,例如 _kCFStreamBlockingOpenMode 用來排程網路任務。因此,NSTimer 在設定 kCFRunLoopCommonModes 的時候,也有可能因為 private mode 的呼叫從而導致延時。
  • Runloop mode 可以中途切換,有以下幾種切換位置:
    • sleep 之前
    • 執行 mainqueue 任務前
    • exit 之後
  • Runloop 的運用場景:
    • 執行自己的任務,如 timer
    • 用於觀測主執行緒的執行狀態

延展閱讀

? ? 一個 Demo 入門 Flutter

最近,已經有許多的公司開場嘗試使用 Flutter 進行開發。就在前兩天,Google 剛剛在北京舉辦了 Flutter Live 大會,可以說,Flutter 的生態已經越來越龐大。今年,如果對 Flutter 還是一無所知的話,是不是有點 out 了呢?沒關係,這不,就有一篇教大家入門的文章。文章不僅講了 Flutter 的基本結構,還用實際的程式碼編寫了一個 Demo,想學 Flutter 的同學不妨跟著做一遍,相信比單單看文章更有效果哦。

? A modular analytics layer in Swift

在公司裡擼業務的開發同學對資料打點應該都不陌生,很多需求甚至一半的時間會花在實現打點邏輯上面,本文提出了一種抽象打點層的設計,用很 Swifty 的方式實現了可擴充套件(無痛新增新的 event),和後端解耦(切換打點 backend 不需要重構客戶端打點程式碼)以及易配置(不同的打點攜帶不同的引數)。本文所體現的設計方面的思考對打點之外的一些公共元件的設計也能起到一定的指導作用,值得學習。

? Seemingly Impossible Swift Programs

本文藉助 “Swift 中判斷函式相等性” 的命題極力使用簡單的描述和循序漸進的過程來講解複雜的拓撲數學。

在建設性數學中,任何命題都可以轉化為型別,任何證據都可以轉化為這種型別的值。這使得我們能夠將函式抽象成計算過程和返回值。在拓撲數學中,無限多資料的行為也會表現得像有限集合。 這使得我們可以證明這些計算過程的相等性。

雖然論證的過程和結果對於日常的 Swift 開發並沒有用,但希望它們可以讓你對數學燃起興趣並感到敬畏。要知道數學已經能夠產生這樣一個違反直覺的結果,並對其原因進行極其簡潔的解釋。你甚至可以相信數學是指導你如何更好完成程式設計的燈塔。這些簡單的數學結構(Functions, Monoids)構成了抽象的強大基礎,而不像專案中的那些設計模式,過於複雜且只解決特定問題。

? 使用 Metal 和 Core ML 評價照片質量

文章展示了常規演算法+機器學習來評價照片質量的方法,常規演算法使用 Metal 處理圖片,根據飽和度、亮度、模糊度和顏色分佈得出客觀評分,機器學習則使用 Core ML 載入 NIMA 模型預測主觀評分。得到照片評分後,再檢測相似照片,最終挑選最優的照片推薦給使用者。

demo 中給出了 Metal 版邊緣檢測濾鏡與圖片特徵向量提取的程式碼,可供學習參考。文章還總結了開源模型轉化為 mlmodel 過程踩的坑。

? Why should we use Swift over Objective-C?

Swift vs Objective-C,到底該怎麼選?如果你正在糾結這個問題,請細讀此文。

Objective-C 有著幾十年的歷史,更穩定;Swift,更現代化的語言,有許多先進特性,文章從多個角度對比了兩種語言的優勢和劣勢。

? Strategy pattern in Swift

文章作者提出了一種用 Strategy pattern 思路來統一程式碼介面的做法。如果你對 Strategy pattern 不是很熟悉的話,可以看一下 Wiki 中這裡的介紹。

這種模式在現實場景中有時候還是能起到一定的作用的,有興趣的同學不妨讀一讀文章,說不定以後就用上了呢?

? Using errors as control flow in Swift

本文重點集中在使用 errors 上,主要介紹了一些用 errors 來進行處理能有明顯優勢的場景,而這些場景主要包括了函式輸出結果的錯誤的處理,輸入引數驗證和測試中錯誤的丟擲等。

由於 Objective-C 或多或少的影響,很多同學在寫 Swift 的時候依然沒有習慣用 errors 來進行錯誤處理。如果存在這樣的情況的話,不妨可以從下一次小 refactor 中出發去尋找有沒有可以使用的場景,多嘗試,逐漸就能習慣使用。

? Xcode UI Testing Cheat Sheet

文章列出了 UI Testing 常用的程式碼片段,除了對 API 的梳理,還有對各種常見問題的解決方案,可以作為 UI Testing 的快速入門,也可以作為知識庫以備日後查閱。

? 質量監控-圖片減包

本文作者提供了三種方法,通過對圖片資源的處理以達到減小包大小的目的。這三種方法分別是:

  • 使用工具壓縮圖片
  • 查詢刪除重複圖片
  • 查詢複用相似圖片

作者不僅詳細講解了具體的實現原理,還提供了相關實現程式碼。有興趣的同學可以參考作者提供的方法,對自己的專案進行改造優化。

? Metal 專輯

Metal 官方文件的中文翻譯和 Metal 相關技術部落格,適合英文不太好的同學。

? 【AR 開發】ARKit 和 ARCore 功能對照表與定位場景總結

ARKit 和 ARCore 功能對照表與定位場景總結,如果您同時開發 ARKit 和 ARCore,可能會用得上。

設計

? Animations in iOS: 30 beautiful examples

有一些 iOS 動畫真的很神奇,順滑和友好的過渡動畫能夠指引流程,讓使用者理解下一步操作,即使盯著進度條也能感覺愉悅。下面請欣賞文中列出的 30 個動畫傑作。

程式碼

Kingfisher 5.0 釋出

喵大的 Kingfisher 迎來了5.0的大版本更新,更新日誌中的 Reborn 一詞意味著重大更新。

Kingfisher 是一個輕量級的、純 swift 網路圖片載入庫。雖然是大版本更新,但是 API 的變化不大,如果你從4.0升級到5.0或許只需要幾分鐘處理一下警告和錯誤。其中最大的變化就是提供了更好的快取策略。因此,同學們可以考慮升級一番。

  • 加入 Result 型別取代原來的 tuples 回撥
  • 為了方便除錯追查錯誤,返回錯誤資訊增加了錯誤原因和必要的關聯資訊
  • ImageCache 重寫,提供記憶體和硬碟快取策略,API 相容舊版本,同時提供了控制快取最大值,是否預快取等等配置
  • 快取策略:先搜尋記憶體,沒命中則搜尋硬碟
  • 支援 ImageDataProvider 協議載入本地圖片

更新詳情請參考:

Swift 官方 Docker 映象

蘋果維護的 Swift 映象,現在已經被 Docker 官方收納。因此只需要執行 docker pull swift 即可方便搭建 Swift 的各個版本環境。目前來看蘋果對於此映象的維護程度還是蠻高的,最新支援到 Swift4.2.1 版本,與開發版本同步。

音視訊

? Functional Swift Conference 2018

Swift 從誕生之日起,就具備了海量的函數語言程式設計特性,無論是 enum 和 optional 的實現,或者是函式被當做一類公民,整個語言能看到不少 Haskell 的影子。自然,Swift 在實現一些函式式的思想和特性也非常的得心應手。Swift 的函數語言程式設計,目前最經典的應用場景主要還是構建響應式的 viewmodel。如今,越來越多的人開始探索其他場景。Functional Swift Conf 是一個在紐約舉行的,專門探討函式式 Swift 的技術大會,如今已經放出所有的 presentation,其中除了一些 reactive view model 這樣耳熟能詳的話題之外,還有關於 state 管理、可組合 UI 等很有趣的內容。對函數語言程式設計感興趣的同學不容錯過。

ggtalk | 要不要買 HHKB?我問了七位使用者,聽聽他們怎麼說

鍵盤,尤其是機械鍵盤,一直是程式設計師們居家旅行最重要的單品。甚至對於大多數程式設計師來說,鍵盤可能是極少數不多的可以讓自己願意一直花錢的東西,這就牽涉出一個話題:對於大多數程式設計師而言,什麼鍵盤才是自己的最後一把鍵盤呢?本期 ggtalk,幾個程式設計師針對這個話題,聊了聊自己使用 hhkb 的感受,有興趣的同學可以聽聽。

PS:節目裡沒有嚴謹客觀的評測。主觀感受居多,比較輕鬆。

? MVC is Not Your Problem - Joachim Kurz - UIKonf18

近年來,MVC 開發模式飽受爭議,還經常被人抱怨說在這種模式下寫出來的程式碼太多,耦合太重。於是就有很多人力圖通過不斷分解和改良 MVC 模式來解決它帶來的問題。

UIKonf 上的這場分享就是從 MVC 切入來講架構設計的。一開始先是介紹 MVC 模式,隨後指出了很多人都誤解以及用錯了 MVC(分享中引用了很多參考資料,調研很充分),繼而引出了大家容易忽視的點:有問題的不是架構模式,而是使用方式。即使是其他的架構也會帶來其他的問題,如何通過 MVC 以及其他架構來達到開發目的才是重點。

本場分享者 Joachim Kurz,他的觀點很明確,做架構設計,不需要刻板的遵循和套用規範,可以通過尋找合適的分解維度(分享的最後有介紹,27 分鐘之後),讓架構變得合理易懂即可。架構設計適可而止這個度是比較難把握的,需要深入具體需求場景(分享中舉了幾個例子,其中有介紹一個頁面用到 10 個 ViewController 的),在平時的開發過程中不斷實踐和總結。

內推

關注我們

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

老司機 iOS 週報 #48 | 2018-12-17

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

本期編輯

@四娘@享耳先森@Damonwong@張嘉夫@AidenRao@Parsifal@aaaron7@tom510230@anotheren@水水@looping@老老老老老老老驢@邦ben@紅紙@含笑飲砒霜@JimQXanderXu

說明

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

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

相關文章