学习组件化和CTMediator

这篇文章主要介绍CTMediator的基本原理,如果点进来之前没有看过组件化的话,可以学习一下蘑菇街的文章,链接请点击

需要CTMediator这个 Demo 的话,请点击

下面我结合 demo 来学习路由分发的功能点,在 demo 中,使用 Cocopods 导入了三部分,分别为 A_Category , A_swift 和 CTMedior ,三部分分别完成不同的功能.

一:  A_Category

这一部分是 CTMedior 的延展,目的是向外提供一个调用接口获取想要的 UIViewController,向内是调用本身接口进行一系列的转化

//第一个参数:目标类名的后缀,比如目标类名为 Target_A ,那么只要传A就可以,在函数里边已经自动拼接

//视图类名,用于拼出目标类中的方法名,并且调用

//第三个是第二个参数拼接出的方法的参数

//第四个是否缓存目标类,是则缓存在本类中

- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget

二:  A_swift

这里提供了 CTMedior 中生成的目标类和方法,如果需要添加其他的视图供外界调用,则在此添加和在 Target_A 中添加方法或者另外新建类

三: CTMedior

该方法的主要功能是将传进来的目标类字符串和视图字符串分别转化为 NSObject 和 SEL 类型

四: CTMedior 中用到的知识点

1.类型转换,将字符串分别转化为 NSObject 和 SEL

(NSobject)        targetClass = NSClassFromString(targetClassString);

(SEL)                        SEL action = NSSelectorFromString(actionString);

2.在 - (id)safePerformAction:(SEL)action target:(NSObject *)target params:(NSDictionary *)params 方法中,通过上述中转化的类对方法进行实现

  (1).首先获取该方法的返回值,进行判断类型

//在于为另一个类实现的消息创建一个有效的方法签名,必须实现

NSMethodSignature* methodSig = [target methodSignatureForSelector:action];

if(methodSig == nil) {

     return nil;

}

//获得方法 Action_viewControllerWithParams: 的返回值类型

const char* retType = [methodSig methodReturnType];

(2)获取之后对返回值的类型进行判断,不同的返回值类型,进行不同的操作

(3).调用某个对象的消息有两种方法

  第一种

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSig];

[invocation setArgument:¶ms atIndex:2];

[invocation setSelector:action];

[invocation setTarget:target];

  第二种

  [target performSelector:action withObject:params];

相同点: 有相同的父类 NSObject

区别: 在参数个数<= 2 的时候 performSelector:的使用要简单一些,但是在参数个数 > 2的时候 NSInvocation 就简单一些

详情请查看: http://www.jianshu.com/p/8b9b0cd70462

补充点:

1.NSInvocation;用来包装方法和对应的对象,它可以存储方法的名称,对应的对象,对应的参数,

NSMethodSignature:签名:再创建NSMethodSignature的时候,必须传递一个签名对象,签名对象的作用:用于获取参数的个数和方法的返回值

创建签名对象的时候不是使用NSMethodSignature这个类创建,而是方法属于谁就用谁来创建

测试发现,创建NSInvocation必须有签名, target 和 selector 这三个参数

详情查看http://www.jianshu.com/p/da96980648b6 

2.方法 - (id)performActionWithUrl:(NSURL *)url completion:(void (^)(NSDictionary *))completion 的作用

在demo中的APPDelegate实现了该方法

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options

{

    return [[[CTMediator sharedInstance] performActionWithUrl:url completion:nil] boolValue];

}

openURL的方法作用是其他应用通过 openURL的方法打开这个方法所在的app后,这个方法就会被调用,详情查看http://blog.csdn.net/mushaofeng1990/article/details/53162072

所以该方法就是通过调用返回的URL的信息进行拆分,获取目标类和方法,调用后获取想要的信息结果

你可能感兴趣的:(学习组件化和CTMediator)