@qidiandasheng
2020-03-29T13:57:05.000000Z
字数 2502
阅读 1812
iOS架构
https://github.com/lincode/FRDModuleManager
这是豆瓣开发的一款 iOS 模块管理工具,可以减少Appdegate的代码。实现方式是注册各个模块,每一个模块实现UIApplicationDelegate对应的方法。最后由FRDModuleManager统一调用分发到各个模块。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//注册实现UIApplicationDelegate对应方法的模块
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"ModulesRegister" ofType:@"plist"];
FRDModuleManager *manager = [FRDModuleManager sharedInstance];
[manager loadModulesWithPlistFile:plistPath];
//给个模块分发application:didFinishLaunchingWithOptions:方法
[manager application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
[[FRDModuleManager sharedInstance] applicationWillResignActive:application];
}
优点
简单,只需要几行代码就可以解决。
被添加的每个模块都可以“享受”AppDelegate的各个生命周期。
缺点
每个模块都要初始化并分配内存,当FRDModuleManager里注册了大量模块时,会创建大量对象并影响App启动速度。
缺少模块初始化优先级,当有三个模块A,B,C时,正好C依赖于B,B依赖于A,如果在配置文件中配置A,B,C的顺序又是打乱时,初始化会出问题。
https://github.com/JaviSoto/JSDecoupledAppDelegate
JSDecoupledAppDelegate通过拆分AppDelegate里面不同的方法类型来进行分开管理。
@protocol JSApplicationStateDelegate;
@protocol JSApplicationDefaultOrientationDelegate;
@protocol JSApplicationBackgroundFetchDelegate;
@protocol JSApplicationRemoteNotificationsDelegate;
@protocol JSApplicationLocalNotificationsDelegate;
@protocol JSApplicationStateRestorationDelegate;
@protocol JSApplicationURLResourceOpeningDelegate;
@protocol JSApplicationShortcutItemDelegate;
@protocol JSApplicationHealthDelegate;
@protocol JSApplicationProtectedDataDelegate;
@protocol JSApplicationWatchInteractionDelegate;
@protocol JSApplicationExtensionDelegate;
@protocol JSApplicationActivityContinuationDelegate;
然后在main.m里把Appdelegate改为JSDecoupledAppDelegate
return UIApplicationMain(argc, argv, nil, NSStringFromClass([JSDecoupledAppDelegate class]));
然后自己创建类来准守不同的协议进行代码的分拆。比如我要管理app生命周期相关的方法则遵守JSApplicationStateDelegate
协议,然后再load时调用一下方法。
+ (void)load
{
[JSDecoupledAppDelegate sharedAppDelegate].appStateDelegate = [[self alloc] init];
}
优点
JSDecoupledAppDelegate本身对于AppDelegate各个功能的拆分对我们理解AppDelegate有一定帮助——AppDelegate确实承载了太多的功能。
由于各个子代理对象的执行顺序是确定的,因此基本可以解决FRDModuleManager中相互依赖的问题。
缺点
使用它必须废弃原生的AppDelegate,因此我们不能通过((AppDelegate *)[UIApplication sharedApplication].delegate).window
来获取windows,以及window的rootViewController。
https://github.com/jiaopen/AppDelegateExtensions
通过AOP的方式来Hook Appdelegate里面的方法,然后在方法里注册对应方法的通知,把方法通知出去。其他的类里面只要监听对应的通知即可。
创建多个Appdelegate的Category,每个Category实现处理之前Appdelegate里不同的臃肿代码的方法。