# 老司機 iOS 週報 #48 | 2018-12-17
老司機 iOS 週報,只為你呈現有價值的資訊。
你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 SwiftOldDriver%2FiOS-Weekly%2Fissues" rel="nofollow,noindex">Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。
福利
:star2:我們發福利啦~
週報已經快陪伴大家走過一年的時間,非常感謝各位朋友的支援和厚愛。為了在 2019 年能更好地為大家服務,我們舉辦了一個問卷調查活動。在 12 月 27 日,我們會在參與問卷的朋友中選取合適的幾個人贈與學習大禮包和現金獎。至於獎品是什麼,大家可以在這條微博中瞭解,轉發還有額外的抽獎~我們渴望聽到你們的聲音!
新聞
Apple 的年度 app 精選又出爐了,為了介紹和表彰獲選 app,這是 App Store 和 Apple 官方微信聯合呈獻的 2018 App Store 年度頒獎典禮,歡迎圍觀下載。
NIO" rel="nofollow,noindex">Perfect 4 將會使用 SwiftNIO
SwiftNIO 是一個跨平臺、非同步、事件驅動的網路應用框架,可用於快速開發和維護高效能的網路協議伺服器和客戶端。對比同樣是 Swift 服務端的框架的 Vapor,已在今天 5 月釋出的 Vapor 3 中全面使用了該框架。當然作為一個底層框架,你一般不會直接和它打交道。
文章
:star2: :dog2:解密 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
來得到準確的執行時間。 -
Runloop
的Activity
也是通過observer
來通知外部當前處於哪個Activity
,當source0
被執行的情況下,kCFRunLoopBeforeWaiting
和kCFRunLoopAfterWaiting
會被跳過,意味著單純通過對Activity
的回撥進行分析業務程式碼的執行狀態是不可靠的。 -
Runloop mode
分為common mode
和private mode
,作者通過捕獲mode
得到了很多陌生的private mode
,分別用來處理不同的場景,例如_kCFStreamBlockingOpenMode
用來排程網路任務。因此,NSTimer
在設定kCFRunLoopCommonModes
的時候,也有可能因為private mode
的呼叫從而導致延時。 -
Runloop mode
可以中途切換,有以下幾種切換位置:- sleep 之前
- 執行 mainqueue 任務前
- exit 之後
-
Runloop
的運用場景:- 執行自己的任務,如 timer
- 用於觀測主執行緒的執行狀態
延展閱讀
:star2: :turtle: 一個 Demo 入門 Flutter
最近,已經有許多的公司開場嘗試使用 Flutter 進行開發。就在前兩天,Google 剛剛在北京舉辦了 Flutter Live 大會,可以說,Flutter 的生態已經越來越龐大。今年,如果對 Flutter 還是一無所知的話,是不是有點 out 了呢?沒關係,這不,就有一篇教大家入門的文章。文章不僅講了 Flutter 的基本結構,還用實際的程式碼編寫了一個 Demo,想學 Flutter 的同學不妨跟著做一遍,相信比單單看文章更有效果哦。
在公司裡擼業務的開發同學對資料打點應該都不陌生,很多需求甚至一半的時間會花在實現打點邏輯上面,本文提出了一種抽象打點層的設計,用很 Swifty 的方式實現了可擴充套件(無痛新增新的 event),和後端解耦(切換打點 backend 不需要重構客戶端打點程式碼)以及易配置(不同的打點攜帶不同的引數)。本文所體現的設計方面的思考對打點之外的一些公共元件的設計也能起到一定的指導作用,值得學習。
本文藉助 “Swift 中判斷函式相等性” 的命題極力使用簡單的描述和循序漸進的過程來講解複雜的拓撲數學。
在建設性數學中,任何命題都可以轉化為型別,任何證據都可以轉化為這種型別的值。這使得我們能夠將函式抽象成計算過程和返回值。在拓撲數學中,無限多資料的行為也會表現得像有限集合。 這使得我們可以證明這些計算過程的相等性。
雖然論證的過程和結果對於日常的 Swift 開發並沒有用,但希望它們可以讓你對數學燃起興趣並感到敬畏。要知道數學已經能夠產生這樣一個違反直覺的結果,並對其原因進行極其簡潔的解釋。你甚至可以相信數學是指導你如何更好完成程式設計的燈塔。這些簡單的數學結構(Functions, Monoids)構成了抽象的強大基礎,而不像專案中的那些設計模式,過於複雜且只解決特定問題。
文章展示了常規演算法+機器學習來評價照片質量的方法,常規演算法使用 Metal 處理圖片,根據飽和度、亮度、模糊度和顏色分佈得出客觀評分,機器學習則使用 Core ML 載入 NIMA 模型預測主觀評分。得到照片評分後,再檢測相似照片,最終挑選最優的照片推薦給使用者。
demo 中給出了 Metal 版邊緣檢測濾鏡與圖片特徵向量提取的程式碼,可供學習參考。文章還總結了開源模型轉化為 mlmodel 過程踩的坑。
Swift vs Objective-C,到底該怎麼選?如果你正在糾結這個問題,請細讀此文。
Objective-C 有著幾十年的歷史,更穩定;Swift,更現代化的語言,有許多先進特性,文章從多個角度對比了兩種語言的優勢和劣勢。
文章作者提出了一種用 Strategy pattern 思路來統一程式碼介面的做法。如果你對 Strategy pattern 不是很熟悉的話,可以看一下 Wiki 中這裡的介紹。
這種模式在現實場景中有時候還是能起到一定的作用的,有興趣的同學不妨讀一讀文章,說不定以後就用上了呢?
本文重點集中在使用 errors 上,主要介紹了一些用 errors 來進行處理能有明顯優勢的場景,而這些場景主要包括了函式輸出結果的錯誤的處理,輸入引數驗證和測試中錯誤的丟擲等。
由於 Objective-C 或多或少的影響,很多同學在寫 Swift 的時候依然沒有習慣用 errors 來進行錯誤處理。如果存在這樣的情況的話,不妨可以從下一次小 refactor 中出發去尋找有沒有可以使用的場景,多嘗試,逐漸就能習慣使用。
文章列出了 UI Testing 常用的程式碼片段,除了對 API 的梳理,還有對各種常見問題的解決方案,可以作為 UI Testing 的快速入門,也可以作為知識庫以備日後查閱。
:turtle:質量監控-圖片減包
本文作者提供了三種方法,通過對圖片資源的處理以達到減小包大小的目的。這三種方法分別是:
- 使用工具壓縮圖片
- 查詢刪除重複圖片
- 查詢複用相似圖片
作者不僅詳細講解了具體的實現原理,還提供了相關實現程式碼。有興趣的同學可以參考作者提供的方法,對自己的專案進行改造優化。
:turtle:Metal 專輯
Metal 官方文件的中文翻譯和 Metal 相關技術部落格,適合英文不太好的同學。
ARKit 和 ARCore 功能對照表與定位場景總結,如果您同時開發 ARKit 和 ARCore,可能會用得上。
設計
有一些 iOS 動畫真的很神奇,順滑和友好的過渡動畫能夠指引流程,讓使用者理解下一步操作,即使盯著進度條也能感覺愉悅。下面請欣賞文中列出的 30 個動畫傑作。
程式碼
喵大的 Kingfisher
迎來了5.0的大版本更新,更新日誌中的 Reborn
一詞意味著重大更新。
Kingfisher
是一個輕量級的、純 swift
網路圖片載入庫。雖然是大版本更新,但是 API
的變化不大,如果你從4.0升級到5.0或許只需要幾分鐘處理一下警告和錯誤。其中最大的變化就是提供了更好的快取策略。因此,同學們可以考慮升級一番。
- 加入
Result
型別取代原來的tuples
回撥 - 為了方便除錯追查錯誤,返回錯誤資訊增加了錯誤原因和必要的關聯資訊
-
ImageCache
重寫,提供記憶體和硬碟快取策略,API
相容舊版本,同時提供了控制快取最大值,是否預快取等等配置 - 快取策略:先搜尋記憶體,沒命中則搜尋硬碟
- 支援
ImageDataProvider
協議載入本地圖片
更新詳情請參考:
蘋果維護的 Swift 映象,現在已經被Docker 官方收納。因此只需要執行 docker pull swift
即可方便搭建 Swift 的各個版本環境。目前來看蘋果對於此映象的維護程度還是蠻高的,最新支援到 Swift4.2.1 版本,與開發版本同步。
音視訊
Swift 從誕生之日起,就具備了海量的函數語言程式設計特性,無論是 enum 和 optional 的實現,或者是函式被當做一類公民,整個語言能看到不少 Haskell 的影子。自然,Swift 在實現一些函式式的思想和特性也非常的得心應手。Swift 的函數語言程式設計,目前最經典的應用場景主要還是構建響應式的 viewmodel。如今,越來越多的人開始探索其他場景。Functional Swift Conf 是一個在紐約舉行的,專門探討函式式 Swift 的技術大會,如今已經放出所有的 presentation,其中除了一些 reactive view model 這樣耳熟能詳的話題之外,還有關於 state 管理、可組合 UI 等很有趣的內容。對函數語言程式設計感興趣的同學不容錯過。
鍵盤,尤其是機械鍵盤,一直是程式員們居家旅行最重要的單品。甚至對於大多數程式設計師來說,鍵盤可能是極少數不多的可以讓自己願意一直花錢的東西,這就牽涉出一個話題:對於大多數程式設計師而言,什麼鍵盤才是自己的最後一把鍵盤呢?本期 ggtalk,幾個程式設計師針對這個話題,聊了聊自己使用 hhkb 的感受,有興趣的同學可以聽聽。
PS:節目裡沒有嚴謹客觀的評測。主觀感受居多,比較輕鬆。
近年來,MVC 開發模式飽受爭議,還經常被人抱怨說在這種模式下寫出來的程式碼太多,耦合太重。於是就有很多人力圖通過不斷分解和改良 MVC 模式來解決它帶來的問題。
UIKonf 上的這場分享就是從 MVC 切入來講架構設計的。一開始先是介紹 MVC 模式,隨後指出了很多人都誤解以及用錯了 MVC(分享中引用了很多參考資料,調研很充分),繼而引出了大家容易忽視的點:有問題的不是架構模式,而是使用方式。即使是其他的架構也會帶來其他的問題,如何通過 MVC 以及其他架構來達到開發目的才是重點。
本場分享者 Joachim Kurz,他的觀點很明確,做架構設計,不需要刻板的遵循和套用規範,可以通過尋找合適的分解維度(分享的最後有介紹,27 分鐘之後),讓架構變得合理易懂即可。架構設計適可而止這個度是比較難把握的,需要深入具體需求場景(分享中舉了幾個例子,其中有介紹一個頁面用到 10 個 ViewController 的),在平時的開發過程中不斷實踐和總結。
內推
-
小紅書北京/上海招聘 iOS/Android 開發者:負責開發小紅書 APP,APP 改變了大多數人的生活方式,我們改變了大多數女生看待生活的方式,加入我們,與一群年輕有趣的小夥伴一起打造下一個億級使用者產品。郵箱:[email protected]
-
北京-百度網盤 持續招 iOS 開發 :社招、應屆、實習均可。專案在技術上很有挑戰性,團隊技術氛圍極好。誠心希望各路大神前來切磋,也歡迎計算機基礎好的小白來共同學習。簡歷發郵箱[email protected],暫不考慮的也歡迎微博私信@小非86 聊聊~
-
北京-螞蟻金服 招iOS/安卓/前端開發 :負責支付寶會員及帳號業務線,地點北京國貿,金臺夕照地鐵站出口 100 米。有興趣的同學歡迎將簡歷傳送到:[email protected] / [email protected] (同一個郵箱)或者微博私信@折騰範兒_味精 瞭解情況。
-
上海即刻:如果你認識聰明勤奮、膽大心細、有追求的工程師,那就來加入我們吧!任何推薦或簡歷可直接發給 Jason(即刻 iOS leader):[email protected],或微博@JasonYuh。
-
杭州奇志科技招聘 iOS、前端 :奇志科技自 2016 年起通過行業無人機協同工作流 Mesh 進入物聯網與人工智慧領域, 併成功為房地產、建築、測繪、電力巡檢等行業提供無人機解決方案。感興趣可以微博上私信@沒故事的卓同學 瞭解。
-
深圳頭條研發中心誠招各路 iOS 好手一起做取悅自己的專案 :如想了解更多深圳頭條的資訊,可以加小T微信:tomtan,切磋技術和聊情懷都可以喔~~~~
-
北京位元組跳動 iOS 團隊持續招人中 :簡歷可以傳送到郵箱[email protected],或者新增我(@AidenRao)的微信 jingmu1994 瞭解更多公司及崗位資訊。
-
北京百度教育事業部招 iOS 開發 :百度教育事業部,地點:北京西二旗。部門下面有百度閱讀,百度文庫,百度愛聽等 App 產品。團隊技術氛圍濃厚,有興趣的同學歡迎將簡歷傳送到我的郵箱:[email protected]。
關注我們
我們開通了公眾號,每期釋出時公眾號(OldDriverWeekly)會推送訊息,歡迎關注。

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