老司機 iOS 週報 #79 | 2019-08-12

老司機iOS週報發表於2019-08-12

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

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

文章

? ? 抖音研發實踐:基於二進位制檔案重排的解決方案 App 啟動速度提升超 15%

含笑飲砒霜:App 的啟動速度通常是 App 給使用者的第一印象,重要性不言而喻。除了傳統的通過修改業務程式碼的方式,抖音 iOS 客戶端團隊,開拓性的發現通過修改程式碼在二進位制檔案的佈局可以提高啟動效能。

本文從原理出發,介紹了抖音 iOS 客戶端團隊是如何通過靜態掃描和執行時 trace 找到啟動時呼叫的函式,然後修改編譯引數完成二進位制檔案的重新排布。相信在未來,二進位制檔案重排也會有更多應用場景。

最近 Facebook 也在一個技術大會上分享了類似的內容,強烈推薦: 視訊

? ? swift-corelibs-foundation Release Notes for Swift 5.x

@享耳先森@老驢

Swift 開源版的 Foundation 在 Swift 5.x 有了不小的改動:

  1. 依賴:

    Swift 開源版的 Foundation 初版實現大量地使用了開源庫,這次在新版本中整理了一下開源庫的依賴,並且把之前的 Foundation 拆分成了三個庫:

    • Foundation
    • FoundationXML:考慮到大部分人不會使用 XML 相關的功能,所以通過 FoundationXML 將 libxml2 的依賴從 Foundation 裡拆了出來。
    • FoundationNetwork:將 URLSession 相關的網路請求 API 拆了出來。

    FoundationNetwork 的情況比較複雜一點,之前論壇裡的草案 Pitch: Move URLSession to new FoundationNetworking module 比較詳盡地介紹這一次的改動。

    Foundation 網路庫使用的 libcurl 帶來了太多子依賴,一部分甚至和 SwiftNIO 的依賴產生了衝突,並且開發組希望使用 SwiftNIO 作為 URLSession 的底層實現,這一次改動之後依賴鏈就變成了 FoundationNetwork -> SwiftNIO -> Foundation。

  2. Objective-C Runtime 模擬:

    Foundation 為 Swift for Linux 提供了模擬模擬部分 Objective-C 方法。現在,Swift 5.1 中也可以用這樣的方法了:

    let someClass = NSClassFromString("NSTask")
    assert(someClass == Process.self)
    let someName = NSStringFromClass(someClass)
    assert(someName == "NSTask")
    複製程式碼
  3. NSCoder 的改進:

    這個版本的 Swift Foundation 中改進了 NSCoder 的具體實現,讓它能更接近 Darwin 中對應的部分。

  4. NSSortDescriptor 的改動:

    現在,在 Swift Foundation 中包含了 NSSortDescriptor 的實現,同時它與 Objective-C 中對應部分相容。因為有部分的 API 改動,所以推薦有用到 NSSortDescriptor 的開發者看一下對應的文件。

  5. 其他改動: Scanner API 改進,現在不再需要做 Casting 了,更加符合 Swift 的語法習慣。FileHandle API 改進,主要是針對 NSError 變化上的變動,能夠丟擲 Error 而非直接 Crash 了。

? 7000 個未解決 issue,Flutter 看起來很好,用起來挺疼

@CrazyCoderShi:Flutter 自發布以後,國內外都掀起了 Flutter 的學習熱潮,其中褒貶不一,本文作者分享了一些自己在學習過程中的一些心得和體會(吐槽?),好了先開始吐槽:

  • 安裝過程很漫長
  • 一團糟的 Material Design
  • 其他煩心事 (這裡麵包括了一些組建的 Bug)

目前 Flutter 在 GitHub 上有超過 7000 個 issues 未解決,這個數字真的很嚇人。小編本人之前也用 Flutter 開發過 App ,我也趁著這波吐槽一下?,因為問題遠不止 Bernardo Ferrari 說的那些:

  • 跟現有專案混和開發體驗極差
  • PlatformView 的表現相當差強人意,特別是在 iOS 上
  • 生態發展欠缺的還是比較多的

略微做個總結,整體來看問題真的很多,但是 Flutter 自發布 1.0.0 以來還不到一年,發展速度已經是很快了,有不足之處,但也有不少驚豔之光,不然國內的大廠也不會紛紛都在佈局 Flutter 技術的落地,其中走在最前面的鹹魚,想必大家都是知道的。所以,小編覺得,不管從哪個角度來看,都是一個值得嘗試和學習的技術棧,畢竟技多不壓身不是?

補充下原文連結:Flutter looks good, but is painful. Here are my frustrations with it.

? SwiftPreview

核心開發組發了一份草案,內容是新增一個開源庫 SwiftPreview ,用來預釋出一些 non-breaking 的 API 改動。

以往所有提案都必須趕上半年一趟車的 release 才能釋出出來,但這對於相當一部分提案都是非必要的,如果釋出後需要調整或者修改那就又是半年,例如 SE-199 Bool 引入 Toggle 方法,在稽核通過之後六個月才在 Swift 5 釋出了出來。

所以這一次提案是想要加快 Swift 的 API 迭代速度,對於一些不需要編譯器支援,非破壞性的功能都會考慮提前在 SwiftPreview 裡釋出以供大家提前使用,儘早提供反饋。

? SE-0261 Identifiable Protocol

@Damonwong:在 SwiftUI 中引入了 Diff 的概念。意思就是在一個列表重新整理的時候,會根據一個唯一識別符號來判斷是否需要重新渲染,如果通過 Diff 演算法算得某個唯一識別符號並沒有變化,那麼這塊區域就不會重新渲染。而在這個事情中最重要的就是「唯一識別符號」這個東西了,在 SwiftUI 中通過 Identifiable 來約束型別滿足唯一識別符號這個概念。當然,唯一識別符號不僅僅可以使用在 Diff 演算法中,還可以用在很多其他的地方,比如通訊錄聯絡人的唯一識別符號。因此在Swift 社群討論之後,決定把 Identifiable 這個協議加入到標準庫中,並在 Swift 5.1 釋出。

? CocoaPods 1.8 Beta is Here!

@紅紙:Cocoapods 1.8.0 Beta 版來了!本次更新為我們帶來了如下內容:

  1. Master Specs Repo 預設改為 CDN,有效的加快初始設定和依賴分析速度
  2. info_plist Podspec DSL:在使用 use_frameworks! 的動態框架中,pod 現在可以自動生成 Info.plist 檔案,並且你可以在 podspec 中使用鍵值對來修改 plist 檔案中內容
  3. project_name Podfile DSL:在 1.7 版本,pod 可以生成多 Project 的 Pod 功能,在 1.8 中對其進行了擴充套件,自定義多個 pod 可合併成一個 Project
  4. UI Test Bundle Support:支援 UI 測試專案的生成,你可以在 podspec 中選擇 :unit/:ui 來配置,其測試的工程可以通過 app_host_name 來進行設定

工具

? Auto Layout: WTF to FTW

@loopingWTF Auto Layout? 是一個可以用來輔助除錯 Auto Layout 問題的網站,它能夠對我們除錯應用時出現的約束歧義資訊進行解析並視覺化顯示。但是我們都知道在除錯的時候出現 Auto Layout 約束歧義是不影響應用正常執行的,這樣當列印的日誌偏多的時候,就很難及時發現這類提示。即使發現了,還要手動複製提示文字到網站的輸入框裡,比較麻煩。所以本文就介紹了通過在 Xcode 裡設定 Symbolic Breakpoint,當除錯應用時有觸發 UIViewAlertForUnsatisfiableConstraints 就執行自定義的 Python 指令碼,自動獲取和解析斷點除錯的入參資訊並開啟 WTF Auto Layout? 這個網站。想時刻監控 Auto Layout 問題的同學可以嘗試體驗下這個工具流程,當然也可以優化下並不是每次都開啟網站,而是先記錄到文字,再找個時間進行集中分析處理。同時文章也涉及了一些除錯技巧,可以學習下。

Swift API-Digester

@享耳先森:Swift 5.1 裡新增了一個 api-digester 功能,用來列印和比較編譯產物的 API,Swift-NIO 在此基礎上搭建了一個 API Diff 功能,可以預見未來開源框架都會使用這個功能來生成 API Diff,幫助檢驗 Pull Request 對於 API 的影響,ChangeLog 的生成等等。

用類似這樣的命令:swift api-digester -diagnose-sdk --input-paths "dir1" -input-paths "dir2" 就能比較兩個編譯產物的 API 區別,生成類似下面的結果:

Removed Decls Constructor WebSocketFrameDecoder.init(maxFrameSize:automaticErrorHandling:) has been removed EnumElement WebSocketOpcode.unknownControl has been removed EnumElement WebSocketOpcode.unknownNonControl has been removed

Renamed Decls Func WebSocketFrameDecoder.decode(ctx:buffer:) has been renamed to Func WebSocketFrameDecoder.decode(context:buffer:) Func WebSocketFrameDecoder.decodeLast(ctx:buffer:) has been renamed to Func WebSocketFrameDecoder.decodeLast(context:buffer:seenEOF:) Func WebSocketFrameEncoder.write(ctx:data:promise:) has been renamed to Func WebSocketFrameEncoder.write(context:data:promise:) Func WebSocketProtocolErrorHandler.errorCaught(ctx:error:) has been renamed to Func WebSocketProtocolErrorHandler.errorCaught(context:error:)

Type Changes Constructor UInt8.init(webSocketOpcode:) has return type change from UInt8? to UInt8

Matrix-iOS 耗電監控

JimQ:Matrix 是一款微信團隊研發並日常使用的效能探針工具,4 月份開源,當時的監控範圍包括崩潰、卡頓和爆記憶體,現在新增了耗電監控功能。 實現原理是,在應用啟動後開啟一個檢測子執行緒,檢測執行緒不斷去識別出當前應用哪個執行緒的 CPU 佔用過高(通過 thread_basic_info 獲得),將耗 CPU 多的執行緒的堆疊(使用 backtrace() 函式獲取)收集起來。當應用 CPU 佔用達到閾值時,耗電監控將收集到的堆疊組合(接合成呼叫樹,並標記每個函式被收集的次數)形成耗電堆疊(函式次數越大,所佔用 CPU 越多)。

程式碼

? Swift-MemoryLayout

@四娘:作者在學習 Swift 記憶體佈局的過程中,寫了一個簡單的 Demo 演示如何使用指標去讀取 Array / Dictionary 內部的變數,進一步驗證各種型別的記憶體佈局。

這個專案很好地演示了 Swift 裡的指標操作,非常值得一看!!!

? CombineCocoa

@老峰:CombineCocoa 是基於 Combine 對 UIKit Controls 的封裝,類似 RXcocoa 實現了許多元件的繫結功能,可以直接把值和控制元件互相繫結,避免通知、監聽、delegate 等,極大的簡化了 UI 相關邏輯處理,示例如下:

  • textField.textPublisher
  • segmented.selectedSegmentIndexPublisher
  • slider.valuePublisher
  • button.tapPublisher
  • swtch.isOnPublisher
  • datePicker.datePublisher
  • ...

CombineRxSwiftPerformance

@邦Ben:這個 Repo 對比了 Combine 和 RxSwift 目前常用方法的效能表現,作為選型資料可以看下。

最後結論,Combine 速度更快,平均效能比 RxSwift 高出41%。

測試結論

內推

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

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

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

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

關注我們

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

老司機 iOS 週報 #79 | 2019-08-12

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

說明

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

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

相關文章