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解耦
- 模組(類)之間解耦利器:EventPublishSubscribeUtils 事件釋出訂閱工具類解耦事件
- 解耦解耦
- AppDelegate解耦APP解耦
- 開篇 | 模組化與解耦式開發在螞蟻金服 mPaaS 深度實踐探討解耦
- 巧用Fragment解耦onActivityResultFragment解耦
- difflib模組詳解
- psutil模組詳解
- matplotlib模組詳解
- python模組詳解Python
- Spring 解耦反射建立物件Spring解耦反射物件
- 紅外模組詳解
- lms框架模組詳解框架
- 序列化模組,隨機數模組,os模組,sys模組,hashlib模組隨機
- 解耦圖片載入庫解耦
- 手機天貓解耦之路解耦
- Python之time模組詳解Python
- 解決fitz模組報錯
- 詳解AFNetworking的HTTPS模組HTTP
- python 模組:itsdangerous 模組Python
- path模組 fs模組
- Python模組:time模組Python
- 使用Materialise解耦微服務架構解耦微服務架構
- 微服務解耦設計模式 - Neeraj微服務解耦設計模式
- 對前後端解耦的理解後端解耦
- day18:json模組&time模組&zipfile模組JSON
- re模組 函式模式詳解函式模式
- [kubernetes系列]HPA模組深度講解
- 解讀js模組化方案modJSJS
- Node.js util 模組解讀Node.js
- Node.js process 模組解讀Node.js
- Node中fs模組 API詳解API
- CommonJS模組 和 ECMAScript模組JS
- Python模組之urllib模組Python
- python模組之collections模組Python
- iOS-元件化iOS元件化
- 序列化模組,subprocess模組,re模組,常用正則