iOS-模組解耦
最初在網上看到相關內容,是蘑菇街元件化相關討論。(Limboy(文章1 文章2) 和 Casa (文章))。
但是我大家討論的內容應該是如何解耦吧,而不是元件化本身,只不過解耦是元件化的前提而已。
我現在理解的有兩種方案:
一、中介軟體+runtime
//Mediator.m
@implementation Mediator
+ (UIViewController *)BookDetailComponent_viewController:(NSString *)bookId {
Class cls = NSClassFromString(@"BookDetailComponent");
return [cls performSelector:NSSelectorFromString(@"detailViewController:") withObject:@{@"bookId":bookId}];
}
+ (UIViewController *)ReviewComponent_viewController:(NSString *)bookId type:(NSInteger)type {
Class cls = NSClassFromString(@"ReviewComponent");
return [cls performSelector:NSSelectorFromString(@"reviewViewController:") withObject:@{@"bookId":bookId, @"type": @(type)}];
}
@end
當然直接這樣寫,元件(模組)多了以後,這個中介軟體將會變的異常龐大,所以可以通過category方式分離元件介面程式碼。這裡有個文章具體講解了細節實現,增加了通過 target-action 簡化寫法。
二、URL+Block
中介軟體提供方法,可以將url和block進行繫結,各元件都要首先呼叫註冊方法,把自己的功能(block)和對應的url註冊到中介軟體中,才能讓其他元件通過url呼叫。
一個簡化的實現:
//Mediator.m 中介軟體
@implementation Mediator
typedef void (^componentBlock) (id param);
@property (nonatomic, storng) NSMutableDictionary *cache
- (void)registerURLPattern:(NSString *)urlPattern toHandler:(componentBlock)blk {
[cache setObject:blk forKey:urlPattern];
}
- (void)openURL:(NSString *)url withParam:(id)param {
componentBlock blk = [cache objectForKey:url];
if (blk) blk(param);
}
@end
//BookDetailComponent 元件
#import "Mediator.h"
#import "WRBookDetailViewController.h"
+ (void)initComponent {
[[Mediator sharedInstance] registerURLPattern:@"weread://bookDetail" toHandler:^(NSDictionary *param) {
WRBookDetailViewController *detailVC = [[WRBookDetailViewController alloc] initWithBookId:param[@"bookId"]];
[[UIApplication sharedApplication].keyWindow.rootViewController.navigationController pushViewController:detailVC animated:YES];
}];
}
//WRReadingViewController.m 呼叫者
//ReadingViewController.m
#import "Mediator.h"
+ (void)gotoDetail:(NSString *)bookId {
[[Mediator sharedInstance] openURL:@"weread://bookDetail" withParam:@{@"bookId": bookId}];
}
方案2最大的問題就是每個元件都需要初始化,記憶體裡需要儲存一份表,元件多了會有記憶體問題。
參考:iOS 元件化方案探索
相關文章
- AntNest 模組完全解耦方案解耦
- Android 通過 APT 解耦模組依賴AndroidAPT解耦
- 解耦解耦
- BeeHive-阿里開源iOS模組解耦框架原始碼解析Hive阿里iOS解耦框架原始碼
- AppDelegate解耦APP解耦
- iOS架構設計解耦的嘗試之模組間通訊iOS架構解耦
- 巧用Fragment解耦onActivityResultFragment解耦
- 模組(類)之間解耦利器:EventPublishSubscribeUtils 事件釋出訂閱工具類解耦事件
- 手機天貓解耦之路解耦
- 解耦 HTML、CSS 和 JavaScript解耦HTMLCSSJavaScript
- 解耦HTML、CSS和JavaScript解耦HTMLCSSJavaScript
- 物件導向與解耦物件解耦
- 解耦圖片載入庫解耦
- Spring 解耦反射建立物件Spring解耦反射物件
- 解耦設計手法總結解耦
- iOS-九宮格密碼解鎖iOS密碼
- iOS- 詳解文字屬性AttributesiOS
- 解耦解的早,改需求沒煩惱解耦
- 對前後端解耦的理解後端解耦
- 微服務解耦設計模式 - Neeraj微服務解耦設計模式
- 使用Materialise解耦微服務架構解耦微服務架構
- 開篇 | 模組化與解耦式開發在螞蟻金服 mPaaS 深度實踐探討解耦
- [譯] 通過測試來解耦 Activity解耦
- Swift中依賴注入的解耦策略Swift依賴注入解耦
- MVC3使用Area解耦專案MVC解耦
- iOS-元件化iOS元件化
- Spring:工廠模式哪裡解耦了?Spring模式解耦
- 如何優雅的對UITableView進行解耦UIView解耦
- Java 工程解耦即高內聚低耦合Java解耦
- 詳解command設計模式,解耦操作和回滾設計模式解耦
- [譯] 用依賴注入解耦你的程式碼依賴注入解耦
- 29.Flutter與原生解耦式混合開發Flutter解耦
- 複雜任務中,流程的解耦設計解耦
- 命令模式-接收者與執行者解耦和模式解耦
- Android T-MVVM深度解耦開發框架AndroidMVVM解耦框架
- 使用Materialise物化檢視解耦微服務架構解耦微服務架構
- 巧用 LLVM 特性: Objective-C Class Properties 解耦LVMObject解耦
- iOS-自定義PickerViewiOSView