AppDelegate解耦

在路上重名了啊發表於2018-11-18

方案一:FRDModuleManager

FRDModuleManager 提供了一個統一的介面,讓各模組知曉應用的生命週期。在 AppDelegate 中留下鉤子,在特定的生命週期呼叫模組的對應方法。這樣將使得 AppDelegate 更簡單。對於應用生命週期的使用也更清晰。 evernotecid://6F55E44D-BBC1-43F1-9310-4138A0D19764/appyinxiangcom/11652118/ENResource/p18418

AppDelegate解耦

使用:參考github文件

優點:

  • 1、簡單,只需要幾行程式碼就可以解決。
  • 2、被新增的每個模組都可以“享受”AppDelegate的各個生命週期。

缺點:

  • 1、每個模組都要初始化並分配記憶體,當FRDModuleManager裡註冊了大量模組時,會建立大量物件並影響App啟動速度。
  • 2、缺少模組初始化優先順序,當有三個模組A,B,C時,正好C依賴於B,B依賴於A,如果在配置檔案中配置A,B,C的順序又是打亂時,初始化會出問題。

其實第2個缺點是可以避免的,我們可以調整plist檔案中的類的順序,來實現模組的呼叫順序。我們拿FRDModuleManager的demo中的plist檔案來驗證一下。

順序一:FRDGroupModule在上面

AppDelegate解耦
對應下面的呼叫日誌
AppDelegate解耦

順序二:FRDGroupModule在下面

AppDelegate解耦
對應下面的呼叫日誌
AppDelegate解耦

方案二:JSDecoupledAppDelegate

JSDecoupledAppDelegate是由JSBadgeView的作者開發的一款輕量級的AppDelegate解耦工具。它將AppDelegate各個功能點獨立出來,並通過代理的方式將控制權下發。實現原理,利用Objective-C的訊息轉發機制,轉發AppDelegate的各個方法來實現AppDelegate的解耦的

AppDelegate解耦

使用:參考github文件

優點:

  • 1、JSDecoupledAppDelegate本身對於AppDelegate各個功能的拆分對我們理解AppDelegate有一定幫助——AppDelegate確實承載了太多的功能。
  • 2、由於各個子代理物件的執行順序是確定的,因此基本可以解決FRDModuleManager中相互依賴的問題。

缺點:

JSDecoupledAppDelegate的缺點非常明顯:使用它必須廢棄原生的AppDelegate,因此我們不能通過((AppDelegate *)[UIApplication sharedApplication].delegate).window來獲取window,以及window的rootViewController。

方案三:AppDelegate分類(Category)

優點:

不需要新增任何三方庫,我們就可以給AppDelegate新增很多方法,並且能輕鬆控制方法的執行順序

缺點:

新增新的屬性比較繁瑣,只能通過runtime或者BlocksKit等三方庫實現

參考: DelegateDietDemo

相關文章