- 以前写过一篇关于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的分类中实现相关逻辑(可根据功能或控制器进行分类实现).
- 2.使用协议,协议里面声明的就是类似UIApplicationDelegate代理方法。业务组件里面添加一个遵循这个协议的对象,实现你想在AppDelegate里面实现的对应方法。
- 3.使用单例类,添加全局变量NSMutableArray用于存放各业务组件里面的问题2中的对象,在主工程AppDelegate的代理方法里面遍历数组调用各业务组件里面问题1对象的协议方法,当然,这个遍历数组、调用方法的实现应该放在单例类里面实现。
实现思路是这样的,具体实现给大家提供一个示例:
image.png
DMUserCenterModule:用户中心模块上面提到的对象。DMApplicationDelegate:上面提到的协议。DMAppDelegateManager:单例类。
DMUserCenterModule维护在各个业务组件里面;DMApplicationDelegate、DMAppDelegateManager 一般维护在与业务不太相关的弱组件库里面。