标签:
前段时间整理项目中的AppDelegate
,发现很多写在- application:didFinishLaunchingWithOptions:
中的代码都只是为了在程序启动时获得一次调用机会,多为某些模块的初始化工作,如:
1 2 3 4 5 6 7 8 |
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
[FooModule setup];
[[BarModule sharedInstance] setup];
// ...
return YES;
}
|
其实这些代码完全可以利用Notification
的方式在自己的模块内部搞定,分享一个巧妙的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// FooModule.m
+ (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
方法在足够早的时间点被调用__NSObserver *
对象用来给外部remove观察者__block
,会捕获到nil值得注意的是,通知是在- application:didFinishLaunchingWithOptions:
调用完成后才发送的。
顺便提下给AppDelegate瘦身的建议:AppDelegate作为程序级状态变化的delegate,应该只做路由和分发的作用,具体逻辑实现代码还是应该在分别的模块中,这个文件应该保持整洁,除了<UIApplicationDelegate>
的方法外不应该出现其他方法。
标签:
原文地址:http://www.cnblogs.com/wq-gril/p/4725626.html