組件化
(說白了就是個解耦合的程序)
- 組件化的意義
適用于基礎功能穩定,專案規模較大
專案變大,編譯時間長,基礎模塊的產品間復用
多團隊發布,集成,測驗不便,協同開相互依跟沖突
- 組件化拆分
工具類,基礎功能,基礎UI控制元件,業務線
- 組件化通信選型
Target- Action
●抽離業務邏輯
●通過中間層進行呼叫
●中間層使用runtime反射
●中間層代碼優化
URL Scheme
●使URL處理本地的跳轉
●通過中間層進行注冊&呼叫
●注冊表無需使用反射
●非懶加載/注冊表的維護/引數
Protocol-Class
增加 Protocol Wrapper層
中間件回傳Protocol對應的Class
解決硬編碼的問題
簡單演示Target- Action
點擊串列跳轉到底層頁解耦 內容頁串列頁
- 創建一個類 Mediator,所有類用這個作為中轉
- 我們希望Mediator跟任何類也沒有耦合
第一個類展示
__kindof UIViewController *detailController = [GTMediator detailViewControllerWithUrl:item.articleUrl];
中間代碼
+ (__kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl{
Class detailCls = NSClassFromString(@"GTDetailViewController");
UIViewController *controller = [[detailCls alloc] performSelector:NSSelectorFromString(@"initWithUrlString:") withObject:detailUrl];
return controller;
}
上面兩個都是用字串來反射出類 還有類的方法的
第一個類呼叫Mediator來解開跟Detali的耦合
然而中間代碼又利用反射機制解開跟detail的耦合
我們再看一下

這個以物件作為引數向接收方發送訊息的方法只能傳遞一個引數,有局限性
二是他使用NSString硬編碼
在這里我們復習一下__kindof
kindof定義
instancetyp跟id詳解
urlScheme
**
簡單來說就是講需要暴露出的detail注冊到中間的dediator
**
中間層
typedef void(^GTMediatorProcessBlock)(NSDictionary *params);
+ (void)registerScheme:(NSString *)scheme processBlock:(GTMediatorProcessBlock)processBlock;
+ (void)openUrl:(NSString *)url params:(NSDictionary *)params;
注冊
+ (void)load {
[GTMediator registerScheme:@"detail://" processBlock:^(NSDictionary * _Nonnull params) {
NSString *url = (NSString *)[params objectForKey:@"url"];
UINavigationController *navigationController = (UINavigationController *)[params objectForKey:@"controller"];
GTDetailViewController *controller = [[GTDetailViewController alloc] initWithUrlString:url];
// controller.title = [NSString stringWithFormat:@"%@", @(indexPath.row)];
[navigationController pushViewController:controller animated:YES];
}];
[GTMediator registerProtol:@protocol(GTDetailViewControllerProtocol) class:[self class]];
}
呼叫者
[GTMediator openUrl:@"detail" params:@{@"url":item.articleUrl,@"controller":self.navigationController}];
弊端很多不建議使用
Protocol-Class
在mediator中添加方法
//protol class
+ (void)registerProtol:(Protocol *)proto class:(Class)cls;//注冊protocol跟class的關系
+ (Class)classForProtocol:(Protocol *)proto;//通過protocol回傳class
實作方法
#pragma mark -
+ (NSMutableDictionary *)mediatorCache{
static NSMutableDictionary *cache;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cache = @{}.mutableCopy;
});
return cache;
}
@protocol GTDetailViewControllerProtocol <NSObject>
- (__kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl;
@end
+ (void)registerProtol:(Protocol *)proto class:(Class)cls{
if (proto && cls) {//如果兩個都不為空那么就通過協議來 跟class加入到字典里面
[[[self class] mediatorCache] setObject:cls forKey:NSStringFromProtocol(proto)];
}
}
+ (Class)classForProtocol:(Protocol *)proto{
//通過協議在字典里面尋找key
return [[[self class] mediatorCache] objectForKey:NSStringFromProtocol(proto)];
}
呼叫者
Class cls = [GTMediator classForProtocol:@protocol(GTDetailViewControllerProtocol)];
[self.navigationController pushViewController:[[cls alloc] detailViewControllerWithUrl:item.articleUrl] animated:YES];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:item.uniqueKey];
注冊的人
[GTMediator registerProtol:@protocol(GTDetailViewControllerProtocol) class:[self class]];
制作不易,記得點贊
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/297335.html
標籤:其他
