GITHUB地址git
此架構的核心思想是,將經典的基於整個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經過模塊註冊信息,找到模塊的代理者,並向模塊代理者詢問此模塊的根視圖控制器以跳轉到此視圖控制器。