iOS模塊化解耦方案

GITHUB地址git

FisherMan

架構概覽

FisherMan

此架構的核心思想是,將經典的基於整個APP維度的AppDelegate、RootViewController縮小爲模塊維度,即整個項目由多個模塊組合而成,每一個模塊都有本身的ModDelegate、ModRootViewController,由一個全局的容器來包含這些模塊,APP的生命週期也交由這個全局容器處理,容器再將APP事件分發到各個模塊。全部模塊和服務只依賴此容器,模塊間互不依賴github

拆分

面向協議

此架構主要利用OC的協議,來達到約束模塊和服務的目的,同時協議也使得架構更加靈活、有效減小耦合和強依賴。如下兩個協議即此架構的核心協議架構

1. FSMModProtocol
app

全部模塊的代理者都須要遵照此協議,以統一模塊與容器的交互一致性,以及接收app的生命週期事件。fetch

@protocol FSMModProtocol <NSObject>

@required

//返回當前模塊的根視圖控制器

- (UIViewController *)rootViewControllerForMod;

@optional

- (void)modDidFinishLaunchingWithOptions:(NSDictionary *)options;

- (void)modWillResignActive;

- (void)modDidEnterBackground;

- (void)modWillEnterForeground;

- (void)modDidBecomeActive;

- (void)modWillTerminate;

- (void)modDidReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

@end

複製代碼

2. FSMServiceProtol
ui

全部服務協議的根協議,主要定義了服務的生命週期事件,統一服務模型,以便於各服務提供者在各個生命週期作數據初始化或邏輯處理等spa


核心方法

  • 模塊間的跳轉
//啓動訂單模塊

[[FisherMan man] launchModuleWithName:@"TradeMod" parameters:nil transition:FMModTransitionTypePush];

複製代碼
  • 服務的調用
//定義登陸服務所能提供的服務

@protocol LoginService <FSMServiceProtocol>

- (void)loginWithUserName:(NSString *)userName passwd:(NSString *)passwd;

- (NSString *)loginUserName;

@end

//調用登陸服務

id<LoginService> loginService = [[FisherMan man] findServiceWithName:@"LoginService"];

[loginService loginWithUserName:@"xiaowang" passwd:@"123"];

複製代碼

服務的調用方和提供方不直接依賴,而是經過中間者和虛擬的服務協議,若之後服務提供方須要更換,調用方代碼無需變更,易於切換代理

註冊

採用plist來保存模塊和服務的註冊信息code

註冊

tip:這裏services和modules的信息放在一個plist文件裏面,若項目過大,可考慮將services和modules的註冊plist文件拆成兩個分別存放。cdn

  • 每一個服務的信息包括服務名(name)及服務的實現類名(imp)組成。

  • 每一個模塊的信息包括模塊的名(name)及模塊的代理者類名(delegate)組成。

大體流程

1. APP啓動後初始化FisherContext,指定plist等

2. FisherMan讀取plist文件,獲取模塊和服務的註冊信息

2. 啓動註冊的服務,並記錄運行中的服務

3. 建立註冊表中第一個模塊的代理者,詢問代理者以獲取第一個模塊的根視圖控制器,做爲app啓動的第一個界面

4. 模塊中調用服務時,經過FisherMan和服務名查找對應服務,FisherMan經過服務註冊信息找到實際服務提供者

5. 啓動其它模塊時,經過FiserMan和模塊名來啓動並跳轉,FisherMan經過模塊註冊信息,找到模塊的代理者,並向模塊代理者詢問此模塊的根視圖控制器以跳轉到此視圖控制器。


詳細內容請下載代碼查看

GITHUB地址

相關文章
相關標籤/搜索