2017GMTC Swift在Airbnb的應用實踐

主要分享了Airbnb使用Swift的一些經驗,Airbnb的Swift代碼的使用已占大約80%~90%,算是業界比較多的了。

Swift的主要特性以及在Airbnb的應?

安全
Swift使用Optional Variable區分是否為空,TT?為不同的兩個類型,使用WrapUnwrap進行轉換

對于let vs var,盡量使用不可變的let

Swift提供了高級枚舉類型,使得enum變得異常強大,可以支持之前傳統上只有類才可以支持的特性,比如計算屬性、實例方法、初始化、擴展、協議等。

Protocol Oriented Programming
這個之前沒有注意,但事實上Swift整個語言與OC已經截然不同,OC依然是傳統的面向對象編程,而Swift已經是面向協議的編程。

可以通過ASIHttpRequestAFNetworking各自實現網絡請求的方式來比較

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWrong:)];
[request startAsynchronous];

ASIHttpRequest是面向對象的,你需要實現一個對象的實例,設置屬性,調用對應的方法。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"www.olinone.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    
}];

AFNetworking是面向協議的,你可以看到這里只需要對方法進行直接調用,而不需要了解對象的屬性。

我們自己在使用Swift的轉換中,似乎還沒有意識到這一點。

泛型
在可能處理多種類型的地方使用泛型:


這里類型可能會有如下三種:

CarouselComponent<HomeCardComponent>
CarouselComponent<ExperienceCardComponent>
CarouselComponent<GuidebookComponent>

其他特性
Memory Management:全部是ARC
Less Code:沒有.h .m
Faster: Struct 使用棧,Class使用堆;Swift的Copy Write在堆上面
Tuples:支持多元組,不同類型的集合
Access Control:OC的動態特性破壞了訪問控制,而Swift不支持動態特性

Airbnb遇到的問題以及解決方案

編譯時間

Airbnb在開發的過程中編譯的時間越來越長,發現是由于Swift進行“類型推導以及類型檢查”時耗費了大量的時間。

如何調試編譯時間,發現占時過多的方法:

target -> Build Settings -> Other Swift Flags 添加編譯設置
-Xfrontend -debug-time-function-bodies

在“times.txt”文件中查看各個方法的耗時,下面的命令可以排序
xcodebuild -workspace yourWorkspaceName.xcworkspace -scheme schemeName clean build 2>&1 |egrep "d.dms"|sort -nr > times.txt

根據檢查出來的問題,總結了一些有針對性的解決方案:

  1. Use CI system to monitor the build time.
  2. Educate engineers to provide type information as much as possible.
  3. Use Lint to prevent engineers from common issues.
  4. Offline type inference (Use SourceKit).

BUCK
使用BUCK編譯系統來提高編譯速度(并行編譯、增量編譯、緩存編譯中間結果、開源)

Whole Module Optimization

全模塊優化WMO的原理就是在編譯項目時,將所有源代碼合起來作為一個整體進行分析和優化,與單文件優化SFO(Single File Optimization)相區別,通過排除死函數、去inline函數調用等優化最終的目標文件,可以數倍的提高性能。

這篇文章評測 Swift 3.0 項目編譯優化選項對編譯速度的影響研究了三種模式的編譯時間:

  • None: 102s
  • Fast, SFO: 122s
  • Fast, WMO: 89s

這里比較有趣的一點是WMO作為優化了的編譯方式,所花的時間比不優化的還要快,官方的解釋是既優化了性能,又優化了編譯速度(好吧~)

WMO在Release默認打開,但是在Debug默認關閉,這是因為WMO的增量編譯做的不好:改動一個文件后,編譯器還得把所有的文件再編譯一遍。

此外,針對WMO,這篇文章優化 Swift 編譯速度有更深入的分析:把所有Model文件全部合并到一個文件去編譯,這樣做的效率提升超過了WMO。

這是因為,WHO除了合并文件之外,還會在預編譯階段做一些事情,包括:檢測并去掉沒有被調用的方法和類型;給沒有被繼承的類或方法加上final標簽,優化為靜態調用或者內聯進去。

這些優化可以大幅提升程序的效率,但是導致在編譯階段每合并一個文件,就會遍歷所有文件進行一次檢查,使得編譯時間過多。 這里采用了一個比較“Tricky”的方法做到只合并文件,不做優化

這種方法解決了上面的問題,不過之前增量編譯的問題同樣存在:增量編譯的顆粒度從File級別增大到Module級別。

Airbnb這里采用的就是這種方法,不過,這種方法對Airbnb很有用,是因為:Airbnb有70個左右的類庫,這在某種程度上降低了增量編譯的顆粒度級別。但是對于我們這種只有一個Target的工程來說,好處不大。

啟動性能

Airbnb通過下面的方法調試啟動性能:


動態庫合并

Dynamic Library Merging

  • Consolidate Assets (Pre)
  • Build pods filelist
  • Build internal libraries filelist
  • Consolidate Assets (Post)
  • Remove unnecessary embbed libraries

Airbnb通過這些操作,減少了12M的安裝控件,以及降低了50%的"Pre-main Time"

Swift和Objective-C混用

提到了兩點

  • 一定要在oc代碼里面正確的標注nullable
  • 增量編譯時間

為了與Swift中可選對象對應,OC提供nullable, nonnull

問題

1 改一個文件,從0開始編譯,增量編譯有沒有影響?更慢?
所有的文件都放到一個里面編譯,不加選項的話,就是單個文件。所以增量編譯是沒有優勢的,但是要rebase的話不一樣。 Airbnb有七十多個類庫,所以可以使用這種方法。

2 設計方法的時候,如何取舍加空或不加空?
不加空最好:避免出錯,性能

3 SwiftLint是一個用來規范代碼的工具

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,715評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,163評論 4 61
  • 今天,我和奶奶一起把班里同學買的書一起搬了過來。 我們用小車把書拉到老教學樓里面的樓梯底下,我們把書拿了下來下...
    谷佳琦閱讀 804評論 0 2
  • 文/元初 深秋的時節,深秋的年齡,我無可救藥的愛上一個姑娘。她是我魂牽夢繞幾十年的愛呀,讓舟自橫的一篇小文,讓肖哥...
    元初閱讀 443評論 0 1
  • 13年看NBA總決賽第六場我哭了。在熱火必輸無疑的情況下,雷阿倫投進了一個神奇的三分球。那一刻我看到了奇跡,我感到...
    齊_ab84閱讀 112評論 0 0