最近在重構(gòu)一個很老的項目,項目很龐大,之前也沒有看過這個項目,那叫一個頭疼,永遠都是牽一發(fā)而動全身,代碼之間的耦合除了大還是大,#import基本每個文件都是一大堆,就連封裝的控件也是有很強的耦合性,因此在重構(gòu)過程中最主要的問題就是解耦和重構(gòu)業(yè)務(wù)代碼,去除很老舊的東西.今天就來記錄一下ios組件(模塊)的構(gòu)建思路.
一般在項目中模塊和模塊之間的通信大多都是從一個頁面跳到另外一個頁面,大多是這樣
#import "FZXAddRenovationDiaryViewController.h"
#pragma mark 跳轉(zhuǎn)到 寫日記
- (void)gotoAddRenovationDiary {
self.editDiaryBtn.userInteractionEnabled = NO;
FZXAddRenovationDiaryViewController *addDiaryVC = [[FZXAddRenovationDiaryViewController alloc] init];
addDiaryVC.orderId = self.orderID;
[self.navigationController pushViewController:addDiaryVC animated:YES];
}
但是這樣出現(xiàn)的結(jié)果就是一旦工程很龐大,#import
便會變成一堆一堆,要想解決這個問題可以采用rntime動態(tài)的調(diào)用類方法,不再用#import
某個文件
- (void)gotoAddRenovationDiary:(NSString *)orderID {
Class cls = NSClassFromString(@"FZXAddRenovationDiaryViewController");
//在FZXAddRenovationDiaryViewController控制器中聲明addRenovationDiaryViewController: orderID:類方法;
UIViewController *diarviewVC = [cls performSelector:NSSelectorFromString(@"addRenovationDiaryViewController":") withObject:@{@"orderID":orderID}];
[self.navigationController pushViewController:diarviewVC];
}
這樣雖然不用再導(dǎo)入文件,但是每處調(diào)用都得寫這么多,而且地方分散,因此創(chuàng)建一個聯(lián)系的中間層,把這些東西統(tǒng)一寫到這個文件中
//創(chuàng)建Mediator類,并在.h中聲明一個類方法;
@interface Mediator : NSObject
+(UIViewController *)OneViewController_viewController:(NSString *)viewStr andColor:(UIColor *)color;
@end
//.m中的實現(xiàn)
#import "Mediator.h"
#import <objc/runtime.h>
@implementation Mediator
+(UIViewController *)OneViewController_viewController:(NSString *)viewStr andColor:(UIColor *)color{
Class cls = NSClassFromString(viewStr);
//添加安全判斷,判斷傳過來的字符串所對應(yīng)的類是否存在
if (object_isClass(cls)) {
//經(jīng)測試runtime動態(tài)生成類并調(diào)用方法只能掉類方法不能調(diào)用實例方法
return [cls performSelector:NSSelectorFromString(@"initoneViewConrllerWithcolor:") withObject:@{@"color":color}];
}
return nil;
}
@end
OneViewController中的代碼實現(xiàn)為.h
//.h
@interface OneViewController : UIViewController
+(UIViewController *)initoneViewConrllerWithcolor:(UIColor *)color;
-(UIViewController *)initWithcolor:(UIColor *)color;
@end
//.m
+(UIViewController *)initoneViewConrllerWithcolor:(UIColor *)color{
return [[self alloc]initWithcolor:color];
}
-(UIViewController *)initWithcolor:(UIColor *)color{
if (self = [super init]) {
self.color = color;
return self;
}
return nil;
}
模擬模塊之間的調(diào)用,無論此頁面和多少個頁面有關(guān)系,都交給Meditor來處理即可
#import "Mediator.h"
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
UIViewController *vc = [Mediator OneViewController_viewController:@"OneViewController" andColor:[UIColor redColor]];
if (vc != nil) {
[self presentViewController:vc animated:YES completion:^{
}];
}
}