Reddit重寫其iOS應用,改進效能、模組化和測試
去年,Reddit一直在努力改進其ofollow,noindex" target="_blank">iOS應用 的效能,同時使其適合更快的迭代週期,改善其測試覆蓋率,提高其可擴充套件性。所有這些都是通過把應用原來的MVC架構改造成 Model-View-Presenter(MVP)架構 實現的。
原來的MVC設計其中一個主要的問題是容易導致大量的檢視控制器 ,這是由於檢視和它需要的控制器之間是緊耦合的 。其中一個明顯的影響是滾動效能退化,從60fps降到了45-55fps,Reddit工程師Andrew Rohn這樣寫道。檢視-控制器的耦合導致任何改進檢視實現的嘗試都需要複製數千行的控制器程式碼。因此,Reddit工程師開始重寫其應用的某些部分,遷移到Model-View-Presenter(MVP) 設計。
雖然與MVC差別不大,但MVP實現了展示層和業務邏輯的更好隔離,如下圖所示。
按照這個思路,Reddit工程師把任何非檢視邏輯從UIViewController中移除,並放到只負責檢視-模型互動的Presenter類中。這樣,UIViewController就負責諸如處理使用者輸入、設定檢視、繫結及管理檢視生命週期這樣的任務。Presenter則關注與它本身有關的資料獲取、轉換以及展示。MVP的關鍵是,Presenter不會直接訪問檢視物件,而是通過一個介面訪問。
遷移到MVP改進了程式碼的模組化和可重用性,使得業務邏輯可以獨立於檢視進行測試。與MVC相比,MVP還有其他的好處,Rohn重點指出,它更適合組合而不是繼承,因為Presenter是一個從檢視控制器分離出的元件,更容易重用或用不同的實現替換。最重要的是,MVP促成了檢視層實現的重寫,藉助Texture 的多執行緒解決了滾動效能問題。Rohn解釋說,使用Texture的最大障礙是處理狀態訪問同步,這需要在Presenter忙於渲染輸入UI時鎖定狀態。
MVP只是眾多MVC遷移選項中的一個。如果你對iOS應用架構的多種可選方法的比較分析感興趣的話,可以讀下Chris Eidhof、Matt Gallagher、Florian Kugler合著的 App Architecture, iOS Application Design Patterns in Swift 。
檢視英文原文:How Reddit Rewrote Their iOS App to Improve Performance, Modularity, and Testing