KZWFoudation系列之Router的设计
原本是要写我自己使用的router的,但是现在这个有点落后了, 所以这篇文章主要说下CTMediator这个router的设计,我觉得这个比较符合当下我对router了解。
它主要有一个类CTMediator,里面有3个方法,performActionWithUrl,performTarget和releaseCachedTargetWithTargetName前2个的作使用主要是返回controller,后一个是清理缓存。performActionWithUrl是根据url解析出所需要的数据在调使用performTarget生成controller,下面来看下performTarget这个主要方法:
- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget{ NSString *targetClassString = [NSString stringWithFormat:@"Target_%@", targetName]; NSString *actionString = [NSString stringWithFormat:@"Action_%@:", actionName]; Class targetClass; NSObject *target = self.cachedTarget[targetClassString]; if (target == nil) { targetClass = NSClassFromString(targetClassString); target = [[targetClass alloc] init]; } SEL action = NSSelectorFromString(actionString); if (target == nil) { // 这里是解决无响应请求的地方之一,这个demo做得比较简单,假如没有可以响应的target,就直接return了。实际开发过程中是可以事前给一个固定的target专门使用于在这个时候顶上,而后解决这种请求的 [self NoTargetActionResponseWithTargetString:targetClassString selectorString:actionString originParams:params]; return nil; } if (shouldCacheTarget) { self.cachedTarget[targetClassString] = target; } if ([target respondsToSelector:action]) { return [self safePerformAction:action target:target params:params]; } else { // 有可能target是Swift对象 actionString = [NSString stringWithFormat:@"Action_%@WithParams:", actionName]; action = NSSelectorFromString(actionString); if ([target respondsToSelector:action]) { return [self safePerformAction:action target:target params:params]; } else { // 这里是解决无响应请求的地方,假如无响应,则尝试调使用对应target的notFound方法统一解决 SEL action = NSSelectorFromString(@"notFound:"); if ([target respondsToSelector:action]) { return [self safePerformAction:action target:target params:params]; } else { // 这里也是解决无响应请求的地方,在notFound都没有的时候,这个demo是直接return了。实际开发过程中,可以使用前面提到的固定的target顶上的。 [self NoTargetActionResponseWithTargetString:targetClassString selectorString:actionString originParams:params]; [self.cachedTarget removeObjectForKey:targetClassString]; return nil; } } }}targetName就是调使用接口的Object,actionName就是调使用方法的SEL,params是参数,shouldCacheTarget代表能否需要缓存,假如需要缓存就把target存起来,Key是targetClassString,Value是target。
通过这种方式进行改造的,外面调使用的方法都很统一,都是调使用performTarget: action: params: shouldCacheTarget:。第三个参数是一个字典,这个字典里面可以传很多参数,只需Key-Value写好即可以了。解决错误的方式也统一在一个地方了,target没有,或者者是target无法响应相应的方法,都可以在Mediator这里进行统一出错解决。
但是在实际开发过程中,不论是界面调使用,组件间调使用,在Mediator中需要定义很多方法。于是做作者又想出了建议我们使用Category的方法,对Mediator的所有方法进行拆分,这样就即可以不会导致Mediator这个类过于庞大了。所以可以看下demo中的#import “CTMediator+CTMediatorModuleAActions.h”是怎样管理的。
代码地址: casatwy/CTMediator
参考文章:https://lpd-ios.github.io/2017/02/26/iOS-Router/
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » KZWFoudation系列之Router的设计