方案一:FRDModuleManager
FRDModuleManager 提供了一個統一的介面,讓各模組知曉應用的生命週期。在 AppDelegate 中留下鉤子,在特定的生命週期呼叫模組的對應方法。這樣將使得 AppDelegate 更簡單。對於應用生命週期的使用也更清晰。 evernotecid://6F55E44D-BBC1-43F1-9310-4138A0D19764/appyinxiangcom/11652118/ENResource/p18418
使用:參考github文件
優點:
- 1、簡單,只需要幾行程式碼就可以解決。
- 2、被新增的每個模組都可以“享受”AppDelegate的各個生命週期。
缺點:
- 1、每個模組都要初始化並分配記憶體,當FRDModuleManager裡註冊了大量模組時,會建立大量物件並影響App啟動速度。
- 2、缺少模組初始化優先順序,當有三個模組A,B,C時,正好C依賴於B,B依賴於A,如果在配置檔案中配置A,B,C的順序又是打亂時,初始化會出問題。
其實第2個缺點是可以避免的,我們可以調整plist檔案中的類的順序,來實現模組的呼叫順序。我們拿FRDModuleManager的demo中的plist檔案來驗證一下。
順序一:FRDGroupModule在上面
對應下面的呼叫日誌順序二:FRDGroupModule在下面
對應下面的呼叫日誌方案二:JSDecoupledAppDelegate
JSDecoupledAppDelegate是由JSBadgeView的作者開發的一款輕量級的AppDelegate解耦工具。它將AppDelegate各個功能點獨立出來,並通過代理的方式將控制權下發。實現原理,利用Objective-C的訊息轉發機制,轉發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