AntNest 模块完全解耦方案
2017-03-09 本文已影响0人
carlSQ
简介
AntNest 是吸收了 Go 语言的 Interface 模型的 iOS 的 App 模块化解耦编程的框架。
- 完全解耦的面向接口插件化模块开发运行框架
- 模块具体实现与接口调用分离
- 易扩展的模块生命周期、事件分发
设计原则
- Go 语言的 Interface 模型
- 蚁巢的蚁室蚁道模型
基本架构
- antRoom 为单独的模块
- antChannel 为 antRoom 之间的通信通道
模块的生命周期
目前支持的模块的生命周期时间:
- 基本的系统事件
- 易扩展事件分发系统
基本的系统事件
目前的支持的基本的系统事件:
- applicationDidEnterBackground
- applicationWillEnterForeground
- applicationDidFinishLaunchingWithOptions
- applicationDidBecomeActive
- applicationWillResignActive
- applicationDidReceiveMemoryWarning
- applicationWillTerminate
- applicationSignificantTimeChange
在子模块中实现对应的方法,AntNest 就会自动的分发到对应的模块。
@implementation ANOrderAntRoom
ANT_EXPORT_ANTROOM()
+ (AntRoomLevel)antRoomLevel {
return 1;
}
+ (instancetype)createInstance:(NSDictionary *)launchOptions {
return [ANOrderAntRoom new];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"ANOrderAntRoom room");
return YES;
}
@end
扩展事件分发系统
AntNest 扩展事件分发是很方便的,举个简单的列子分发推送事件(AntNest 已经这个事件接口)
- 定义事件接口
@protocol ANRemotePushEvent <NSObject>
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler ;
@end
- 定义 AntNest 扩展实现接口,不用去实现具体的方法
@interface AntNest (ANRemotePushEvent)<ANRemotePushEvent>
@end
- 注册事件接口
[[AntNest sharedAntNest] registerProtocolEvent:@protocol(ANRemotePushEvent)];
- 触发事件
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[[AntNest sharedAntNest] application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
模块
怎么去写各个模块,主要分为以下几个部分:
模块注册
ANT_EXPORT_ANTROOM()
模块创建
实现 AntRoomProtocol 协议
antRoomLevel 表示模块的初始化优先级
+ (AntRoomLevel)antRoomLevel {
return 1;
}
+ (instancetype)createInstance:(NSDictionary *)launchOptions {
return [ANOrderAntRoom new];
}
模块通讯
模块间的通讯是通过 AntChannel 进行通讯,里面传递的都是实现 AntProtocol 协议对象。
假如我们要获取一个服务支持如下功能
@property(nonatomic, strong) NSString *orderID;
@property(nonatomic, strong) NSString *customerName;
@property(nonatomic, strong) NSString *shopName;
- (void)payOrder;
自定义一个 Protocol 获取服务实例
@protocol ANOrderDetailProtocol<AntProtocol>
@property(nonatomic, strong) NSString *orderID;
@property(nonatomic, strong) NSString *customerName;
@property(nonatomic, strong) NSString *shopName;
- (void)payOrder;
@end
...
id<ANOrderDetailProtocol> orderDetail = ANT_CHANNEL(ANOrderDetailProtocol, [[ANAntDes alloc] initWith:@"ANOrderDetailAnt"])
AntRoom中的 service 注册
AntChannel 中传递的都是 ant service
ANT_EXPORT_ANT()
+ (AntType)antType {
return @"OrderDetailAnt";
}
+ (instancetype)createInstance:(id<ANOrderDetailDescriptionProtocol>)antDescription {
ANOrderDetailViewController *order = [ANOrderDetailViewController new];
order.title = antDescription.orderID;
order.customerName = antDescription.customerName;
order.shopName = antDescription.shopName;
return order;
}