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

image.png
image.png
DMUserCenterModule:用戶中心模塊上面提到的對象。DMApplicationDelegate:上面提到的協(xié)議。DMAppDelegateManager:單例類。
DMUserCenterModule維護(hù)在各個(gè)業(yè)務(wù)組件里面;DMApplicationDelegate、DMAppDelegateManager 一般維護(hù)在與業(yè)務(wù)不太相關(guān)的弱組件庫里面。
