AntNest 模組完全解耦方案

餓了麼物流技術團隊發表於2018-03-29
2017-03-09 | carlSQ | iOS

簡介

AntNest 是吸收了 Go 語言的 Interface 模型的 iOS 的 App 模組化解耦程式設計的框架。

  • 完全解耦的面向介面外掛化模組開發執行框架
  • 模組具體實現與介面呼叫分離
  • 易擴充套件的模組生命週期、事件分發

設計原則

  • Go 語言的 Interface 模型
  • 蟻巢的蟻室蟻道模型

AntNest 模組完全解耦方案

基本架構

  • antRoom 為單獨的模組
  • antChannel 為 antRoom 之間的通訊通道

AntNest 模組完全解耦方案

模組的生命週期

目前支援的模組的生命週期時間:

  • 基本的系統事件
  • 易擴充套件事件分發系統

基本的系統事件

目前的支援的基本的系統事件:

  • 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:github.com/carlSQ/AntN…

如有任何智慧財產權、版權問題或理論錯誤,還請指正。

轉載請註明原作者及以上資訊。

相關文章