- 以前寫過一篇關于Appdelegate的文章,當時對其他的很多功能和使用技巧還是不是很清楚,只做了一些簡短的介紹,之后自己做了一些測試,也查閱了很多大神的博客和資料,下面就談一談我的一些基本理解:
1.AppDelegate基本認識
要說AppDelegate就得從程序啟動開始,由以下代碼可以看出,AppDelegate就是一個App的代表,所有基于App層級的操作都需要在其內完成
// UIApplicationMain主要負責了:從給定的類名初始化應用程序對象、從給定的應用程序委托類,初始化一個應用程序委托、啟動主事件循環,并開始接收事件
// 第三個參數 principalClassName -- UIApplication 或 UIApplication 子類,nil 默認為 UIApplication
// 第四個參數 delegateClassName -- AppDelagate 類名
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
2.AppDelegate的基本應用環境
蘋果的官方文檔都建議應該由AppDelegate來處理這些工作:
- 1.app的啟動代碼;
- 2.響應app的狀態,比如app切換到后臺和前臺等狀態;
- 3.響應外部傳遞給app的通知,比如說push,low-memory warnings;
- 4.決定了app的狀態是否應該保存或者恢復;
- 5.響應不是發送給特定view或者vc,而是發送給app本身的事件;
- 6.用來保存一些不屬于特定vc的數據。
雖然官方家建議將上述操作放在AppDelegate來處理,但是一個業務邏輯稍復雜點的項目,上述6點的所有功能的代碼直接一股腦塞到一個文件里,能不臃腫才怪了,所以就有了第三點.
3.針對臃腫的AppDelegate我們需要采取的措施與方法
-
1.在AppDelegate的分類中實現相關邏輯(可根據功能或控制器進行分類實現).
10001-8C24-30A8415130EE.png - 2.使用協議,協議里面聲明的就是類似UIApplicationDelegate代理方法。業務組件里面添加一個遵循這個協議的對象,實現你想在AppDelegate里面實現的對應方法。
- 3.使用單例類,添加全局變量NSMutableArray用于存放各業務組件里面的問題2中的對象,在主工程AppDelegate的代理方法里面遍歷數組調用各業務組件里面問題1對象的協議方法,當然,這個遍歷數組、調用方法的實現應該放在單例類里面實現。
實現思路是這樣的,具體實現給大家提供一個示例:
image.png
image.png
DMUserCenterModule:用戶中心模塊上面提到的對象。DMApplicationDelegate:上面提到的協議。DMAppDelegateManager:單例類。
DMUserCenterModule維護在各個業務組件里面;DMApplicationDelegate、DMAppDelegateManager 一般維護在與業務不太相關的弱組件庫里面。