美文网首页iOS
Runtime之组件的构建思路

Runtime之组件的构建思路

作者: ys简单0 | 来源:发表于2017-02-24 15:25 被阅读26次

最近在重构一个很老的项目,项目很庞大,之前也没有看过这个项目,那叫一个头疼,永远都是牵一发而动全身,代码之间的耦合除了大还是大,#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:^{
            
        }];
    }
}

相关文章

  • Runtime之组件的构建思路

    最近在重构一个很老的项目,项目很庞大,之前也没有看过这个项目,那叫一个头疼,永远都是牵一发而动全身,代码之间的耦合...

  • RunTime之方法简介

    在之前的'' UIButton扩大响应范围''以及"ios组件的构建思路"两篇文章中已经用到了RunTime中的方...

  • Sketch组件

    关于Symbol的使用 组件库构建思路:解构-拆分-重构 1.基础组件的制作 2.组件嵌套制作 3.系统组件与通用...

  • 组件化

    前言 组件化方案目前有URL、Runtime、Protocol有三种,组件化方案采用基于Runtime的CTMed...

  • 基础篇

    Runtime之必备C知识 Runtime之类的本质 Runtime之消息处理策略 Runtime之常用API 进...

  • iOS runtime(三)runtime之method(1)m

    iOS runtime(一)runtime之Property 详尽iOS runtime(二)runtime之Iv...

  • vue组件之构建

    关键词:构建组件 引入vue.js* 全局组件 模板方式搭建 注册使用 注意 组件只能有一个根元素 全局组件代码一...

  • 为小组件构建 SwiftUI 视图

    为小组件构建 SwiftUI 视图为小组件构建 SwiftUI 视图

  • Runtime

    kyson老师 iOS开发之runtime(1):runtime调试环境搭建iOS开发之runtime(2):浅析...

  • Spark系列:2.Spark Core Runtime分析:

    博主写的很好,转载过来,方便理解。版本比较老。 Spark Runtime里的主要层次分析,梳理Runtime组件...

网友评论

本文标题:Runtime之组件的构建思路

本文链接:https://www.haomeiwen.com/subject/yujwwttx.html