- 前段時(shí)間整理項(xiàng)目中的AppDelegate慨飘,發(fā)現(xiàn)很多寫在- application:didFinishLaunchingWithOptions:中的代碼都只是為了在程序啟動(dòng)時(shí)獲得一次調(diào)用機(jī)會(huì)旦袋,多為某些模塊的初始化工作,如:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
[FooModule setup];
[[BarModule sharedInstance] setup];
// ...
return YES;
}
- 其實(shí)這些代碼完全可以利用Notification的方式在自己的模塊內(nèi)部搞定撑瞧,分享一個(gè)巧妙的方法:
+ (void)load
{
__block id observer =
[[NSNotificationCenter defaultCenter]
addObserverForName:UIApplicationDidFinishLaunchingNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[self setup]; // Do whatever you want
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
}
解釋:
load方法在足夠早的時(shí)間點(diǎn)被調(diào)用
block 版本的通知注冊(cè)會(huì)產(chǎn)生一個(gè)__NSObserver *對(duì)象用來(lái)給外部 remove 觀察者
block 對(duì) observer 對(duì)象的捕獲早于函數(shù)的返回青自,所以若不加__block攘轩,會(huì)捕獲到 nil
在 block 執(zhí)行結(jié)束時(shí)移除 observer淋叶,無(wú)需其他清理工作
這樣,在模塊內(nèi)部就完成了在程序啟動(dòng)點(diǎn)代碼的掛載
值得注意的是雕拼,通知是在-
application:didFinishLaunchingWithOptions:
調(diào)用完成后才發(fā)送的纵东。
順便提下給AppDelegate
瘦身的建議:AppDelegate
作為程序級(jí)狀態(tài)變化的delegate
,應(yīng)該只做路由和分發(fā)的作用啥寇,具體邏輯實(shí)現(xiàn)代碼還是應(yīng)該在分別的模塊中偎球,這個(gè)文件應(yīng)該保持整潔,除了<UIApplicationDelegate>
的方法外不應(yīng)該出現(xiàn)其他方法辑甜。