老司機 iOS 週報 #68 | 2019-05-20

老司機iOS週報發表於2019-05-20

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

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

新聞

? SE-0260 Library Evolution for Stable ABIs

四娘:目前 ABI 穩定的工作正在逐步收尾,Swift 5.0 達成的是標準庫的 ABI 穩定。但這種 Module ABI 穩定的機制還沒有提供給外部使用者使用。

當前標準庫是通過一些私有的註解和編譯選項來使用這一套機制的,所以這次提案討論的內容就是如何將它作為一個功能提供給我們使用,裡面涉及的主要是一些語法和編譯選項的設計。

需要跟 SDK 打交道的同學可以點選檢視更具體的內容。

(SE-0253)Callable values of user-defined nominal types

Swift Evolution 最近通過的新的提案,(SE-0253)為 Swift 帶來了靜態呼叫的 Callable。作為對比你可以看看在 Swift5.0 中就引入的(SE-0216@dynamicCallable。或者,你也可以對比一下 Python 中的 __call__

新手推薦

? FlutterDartTips

@olddonkey:對於很多剛接觸 Flutter 的同學來說,有一些 Dart 和 Flutter 編寫中的一些小技巧可能並沒有特別的熟悉。這些小知識點很多時候能讓開發的時候,減少掉很多不必要的負擔。

有一位來自印度的同學,就建了這樣的一個專案,專門分享這些 Dart 和 Flutter 的小知識點。即便你已經對此很熟悉了,也不妨可以看看是不是有什麼遺漏的點。

文章

? ? CocoaPods 1.7 新特性

@J_Knight_:本文介紹了 CocoaPods 1.7.0 的幾個新特性:

  1. 支援多個 Swift 版本:可以在 podspec 配置檔案中通過 swift_versions 欄位指定其支援的 Swift 版本。也可以可通過 supports_swift_versions 欄位為 Podfile 檔案中整合的每個 target 指定所需的 Swift 版本。
  2. 引入 App Specs:引入了 app apecs,允許 pod 庫作者在其 podspec 中描述一個應用程式。
  3. 生成多個 Xcodeproj:可以將每個 pod 庫整合為其自己單獨的 Xcode project,並巢狀在頂級 Pods.xcodeproj 下,這樣顯著提高大型 CocoaPods 專案的效能。
  4. 增量安裝:支援了僅重新生成自上次 install 以來發生更改的 pod 庫,而不是像之前那樣重新生成整個 workspace。
  5. 新增 scheme 欄位:可以為 specs,test specs 以及 app specs 自定義 scheme 的生成。
  6. 支援 .xcfilelist:script phases 支援使用 .xcfilelist 來指定指令碼的輸入和輸出路徑。
  7. 為 Master Specs Repo 提供 CDN 支援:啟動了對 CDN 的支援,以避免在本地機器或 CI 系統上克隆 master specs repo,讓使用 CocoaPods 更加方便。
  8. 為 Windows 系統提供支援:新增了對 Windows 系統的支援。

? ? Image Resizing Techniques

@邦Ben:Mattt 大佬說:大量的調整圖片的程式碼都宣稱自己是最正確的。因此,Mattt 給出 5 種不同的技巧以供選擇。什麼情況我們需要縮小調整圖片尺寸?當圖片尺寸遠大於需求的時候,縮小可以節省記憶體提高效能。

  • Drawing to a UIGraphicsImageRenderer (UIKit)
  • Drawing to a Core Graphics Context (Core Graphics)
  • Creating a Thumbnail with Image I/O (Image I/O)
  • Lanczos Resampling with Core Image (Core Image)
  • Image Scaling with vImage (vImage)

最後通過效能對比,前三種方法效能較好。如非必要,不使用後兩種。 各個方法的示例程式碼,請閱讀原文。

? ? A Deep Dive Into Hero Widgets in Flutter

@CrazyCoderShi:對於 Hero 動畫想必做移動開發的同學都不陌生,通常在 Native 開發情況下想要實現這個動畫並不容易,但是在 Flutter 中內部就實現了這一互動效果,只需簡單的使用 Hero 這個 Widget 即可,本文詳細的講解了 Hero 的基本使用和定製化開發。

? 基於協程的程式設計方式在移動端研發的思考及最佳實踐

從超級 App 的效能和程式碼痛點從發,道出 iOS 非同步程式設計現狀存在的缺陷,想必讀者也感同身受。

  • 多執行緒訪問引發野指標問題
  • 多執行緒訪問引發容器類崩潰問題
  • 多執行緒訪問引發過渡釋放問題

從而引出協程,基於協程的全新的非同步程式設計方式,是我們解決現有非同步程式設計問題的有效的方式。想要了解協程的最佳實踐,讀者們可以仔細閱讀本文。

? Xcode Build Configuration Files

在 Xcode 中可以設定我們專案相關各種工程設定,但是把所有的編譯配置都在 Xcode 中設定有時候並不是一個明智的選擇,光 Build Settings 選項裡面就有上百項的設定選項,這並不利於我們維護。但好在蘋果給了我們另外一種方式,使用 xcconfig 檔案。它是用來儲存配置鍵值對的純文字檔案,這使得我們可以分離程式碼和配置,如果你也有為工程配置煩惱過,不妨嘗試試用一下 xcconfig 檔案。

推薦閱讀:

? 在閒魚,我們如何用 Dart 做高效後端開發?

@xiaofei86:Dart 是一門簡潔、容易上手、對非同步支援良好的程式語言,在 Flutter 的開發中大放異彩。本文簡單講解了閒魚使用 Dart 進行後端開發的實踐經驗。在閒魚團隊的努力下,Dart 用於後端開發的支援逐漸完善,前臺和後端開發人員已經能夠快速高效地使用 Dart 開發膠水層介面。未來閒魚團隊會著力於進一步改善 Dart 開發體驗、與 Java 專案的相容性、提升 Dart 遠端服務的效能,挖掘 Dart 在後端開發中更大的潛力。

? What to Expect From Marzipan

Marzipan 是 Apple 內部專案代號,Apple 在 WWDC 2018 釋出了一項計劃:將 UIKit App 遷移到 macOS 上。

@享耳先森:WWDC 2019 不久就要開始,預計 Marzipan 計劃將有新的進展,但作者認為平臺遷移沒有想象中那麼美好,不是光適配程式碼釋出就完事了,作者從開發、設計及市場三個方面分析遷移可能會面對的難題。

工具

Run Swift in browsers

@AidenRao:將 Swift 程式碼編譯為 WebAssembly ,使它能在瀏覽器上直接執行。目前還是第一個版本,Swift 的很多功能還需要支援,感興趣的同學可以加入 swiftwasm

程式碼

? Mango

@looping:MangoFix 是一個 iOS 熱修復 SDK,不同與 JSPatch,它內建了一個語法和 Objective-C 非常類似的 DSL 和對應的解析器。它的設計目標是為了解決 iOS 熱修復問題,所以在使用的便捷程度和效能方面都有很大優勢。對 iOS 熱修復或者製作 DSL 感興趣的同學可以參考作者寫的 《MangoFix:iOS 熱修復另闢蹊徑》《iOS 熱修復 MangoFix 原理分析》 這兩篇文章深入瞭解下。

ui-fabric-ios

ui-fabric-ios 是微軟開源的一個介面框架,可為 iOS 平臺提供 Office UI 體驗。它包含有關顏色和排版的資訊,以及平臺控制元件的自定義,所有這些都來自 Office 和 Office 365 產品中使用的官方 Fluent 設計語言。感興趣的同學可以下載下來深入研究。

mathAI

@蓮叔:拍照做題在生活大爆炸中第一次出現後,就引起了不少關注,這個極具未來感的應用場景隨著計算機視覺技術的發展已經逐漸走近現實,該作者基於 py 實現了一套拍照做題的系統,並在倉庫中附帶了一份 ppt 來介紹自己的防範,大概就是首先通過 opencv 進行字元預處理,然後用 cnn 來識別手寫的字元已經數學符號,並根據空間資訊來重建出手寫公式的資訊結構,最後一步通過編譯原理中的表示式處理等方法來求解式子。作者部分開源了程式碼,但應該也能從中學到主要的流程,有興趣的同學可以學習。

音視訊

ggtalk | 聊聊跨平臺:Weex 尚能飯否?

@蓮叔:如標題所說,這一期的 ggtalk 討論了 Weex 這個頗具爭議的框架。節目中除了聊 Weex 本身的一些問題之外,還聊到了一些對 Weex 比較常見的誤解。雖然 Weex 和 RN 經常被拿來做比較,但其實本身的定位卻有區別,本質上是 for 不同目的的業務場景,比如 RN 比較完整的包裝了系統的介面,目標是儘可能閉環在 RN 的環境中完成整個 app 的開發,而 weex 恰恰相反,其相對簡潔的框架主要是服務於動態 UI 的實現,絕大多數邏輯部分還是依賴於 Native 實現,但也就因為這個特性,Weex 有非常簡潔的和 native 進行 bridge 的框架方法。這類問題在節目中得到了充分的討論,當然也包括其中的一些坑,有興趣的同學可以看看。

內推

老司機週報團隊聯合知識小集和 SwiftGG 翻譯組收錄了一份靠譜的內推職位。

如果你想找工作,點這裡:www.yuque.com/iosalliance…

如果你想招人,點這裡:www.yuque.com/iosalliance…

當然,也歡迎你關注我們每一期的週報,我們會在每期週報底部及時更新編輯內推崗位。

關注我們

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

老司機 iOS 週報 #68 | 2019-05-20

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

說明

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

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

相關文章