AntNest 模块完全解耦方案

作者 carlSQ 日期 2017年03月09日 阅读次数

简介

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


@implementation AntNest (ANRemotePushEvent)

@end

  • 触发事件
- (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"])

ant 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;
}

总结

欢迎 Star:https://github.com/carlSQ/AntNest

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。