Runtime之组件的构建思路

最近在重构一个很老的项目,项目很庞大,之前也没有看过这个项目,那叫一个头疼,永远都是牵一发而动全身,代码之间的耦合除了大还是大,#import基本每个文件都是一大堆,就连封装的控件也是有很强的耦合性,因此在重构过程中最主要的问题就是解耦和重构业务代码,去除很老旧的东西.今天就来记录一下ios组件(模块)的构建思路.
一般在项目中模块和模块之间的通信大多都是从一个页面跳到另外一个页面,大多是这样

#import "FZXAddRenovationDiaryViewController.h" 
#pragma mark  跳转到 写日记
- (void)gotoAddRenovationDiary {
    self.editDiaryBtn.userInteractionEnabled = NO;
    FZXAddRenovationDiaryViewController *addDiaryVC = [[FZXAddRenovationDiaryViewController alloc] init];
    addDiaryVC.orderId = self.orderID;
    [self.navigationController pushViewController:addDiaryVC animated:YES];
}

但是这样出现的结果就是一旦工程很庞大,#import便会变成一堆一堆,要想解决这个问题可以采用rntime动态的调用类方法,不再用#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];
}

这样虽然不用再导入文件,但是每处调用都得写这么多,而且地方分散,因此创建一个联系的中间层,把这些东西统一写到这个文件中

//创建Mediator类,并在.h中声明一个类方法;
@interface Mediator : NSObject
+(UIViewController *)OneViewController_viewController:(NSString *)viewStr andColor:(UIColor *)color;
@end
//.m中的实现
#import "Mediator.h"
#import <objc/runtime.h>
@implementation Mediator
+(UIViewController *)OneViewController_viewController:(NSString *)viewStr andColor:(UIColor *)color{
    Class cls = NSClassFromString(viewStr);
    //添加安全判断,判断传过来的字符串所对应的类是否存在
    if (object_isClass(cls)) {
       //经测试runtime动态生成类并调用方法只能掉类方法不能调用实例方法
       return [cls performSelector:NSSelectorFromString(@"initoneViewConrllerWithcolor:") withObject:@{@"color":color}];
    }
    return nil;
}
@end

OneViewController中的代码实现为.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;
}

模拟模块之间的调用,无论此页面和多少个页面有关系,都交给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:^{
            
        }];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,254评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,347评论 19 139
  • 文/刘小壮(简书作者投稿)原文链接://www.greatytc.com/p/67a6004f6930 前...
    蓝鸥科技阅读 12,781评论 1 56
  • 正文: 道可道也,非恒道也。名可名也,非恒名也。无名,万物之始也;有名,万物之母也。故恒无欲也,以观其眇;恒有欲也...
    叁尺阅读 2,256评论 0 2
  • 昨天是情绪非常不稳定的一天。收到各种的消息的影响,觉得内心波动。那个情绪,想出来又出不来,它是被我在压着的。后来实...
    荣珊聚焦成长阅读 2,463评论 0 2