本来是要写我自己用的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"是怎么管理的。

代码地址:https://github.com/casatwy/CTMediator
参考文章:https://lpd-ios.github.io/2017/02/26/iOS-Router/

KZWFoudation系列之Router的设计相关推荐

  1. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  2. 九十、Python的GUI系列 | QtDesigner进行界面设计

    @Author:Runsen @Date:2020/7/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  3. IP网络设计系列之-局域网设计

    [导读]这是ip网络设计系列讲座的最后一部分,讨论园区局域网设计中遇到的一些问题.以太网交换机优越于传统的集线器环境的好处将首先介绍一下.应用虚拟局域网的动机已经同规划和配置虚拟局域网遇到的问题一起进 ...

  4. 惠普台式计算机系列,惠普发布设计笔记本、设计台式电脑等Z系列产品

    惠普发布新一代惠普Z系列产品,包含设计笔记本.设计台式电脑.显示器和VR等产品. 惠普Z系列设计笔记本HP ZBook 14u G6配有4K显示屏,支持100% Adobe RGB色域显示,拥有600 ...

  5. ML:MLOps系列讲解之《设计机器学习驱动的(ML-powered)软件—我们想要解决的业务问题是什么?》解读

    ML:MLOps系列讲解之<设计机器学习驱动的(ML-powered)软件-我们想要解决的业务问题是什么?>解读 导读:设计机器学习驱动的软件,这部分致力于任何软件项目中最重要的阶段之一- ...

  6. 芯片制造系列全流程:设计、制造、封测

    目录 芯片制造系列全流程(简) 一.芯片制造全流程简介 二.芯片设计 三.芯片制造 四.封装测试 芯片目前分为三个主要环节,分别是设计.制程.封测. 设计水平 制造这一块 最后说说封测这一块 芯片设计 ...

  7. ad15的stc元件库_STC单片机 STC15F系列单片机 Altium PROTEL 设计的器件原理图+PCB封装库文件...

    STC单片机 STC15F系列单片机 Altium PROTEL 设计的器件原理图+PCB封装库文件,Altium Designer.PROTEL原理图PCB封装文件,已经制板在实际项目中使用,可作为 ...

  8. FPGA-Xilinx 7系列FPGA DDR3硬件设计规则

    Xilinx 7系列FPGA DDR3硬件设计规则 引言:本文我们介绍Xilinx 7系列FPGA DDR3硬件设计规则及约束,包括Bank选择.管脚位置约束.管脚分配.端接.I/O标准和走线长度. ...

  9. STM32MP157系列教程连载-硬件设计篇3:STM32MP1微处理器之时钟篇

    STM32MP157系列教程连载-硬件设计篇3:STM32MP1微处理器之时钟篇 一.RCC系统概述 本文涉及的内容主要包含在以下几个文档中,文档可从ST官方网站与意法半导体stm32中国下载. 序号 ...

最新文章

  1. rsyncd.conf 详细配置
  2. 题解报告:hdu 4907 Task schedule
  3. python为类定义构造函数
  4. 服务器不删档的设置_不删档预捏脸开启,快来体验次世代黑科技!
  5. 永久修改VS include目录
  6. 中国区块链开发者的热血时代来临!
  7. struts2中的值栈对象ValueStack
  8. 专利附图绘制-VISIO线条图绘制入门
  9. hfs网络文件服务器如何设置,hfs网络文件服务器的教程
  10. Sublime Text 3 配置C语言运行环境
  11. 计算机3c认证 标准,计算机3C认证怎么办理,检测标准是什么?
  12. (补)地坛书市一逛!
  13. linux ip添加secondary ip,linux 添加secondary ip
  14. linux shell sed快速开始-(添加文本到文件的第一行和最后一行、文本的行尾添加字符)
  15. m3u8切片程序PHP视频切片软件转码系统易语言源码 云转码工具源码
  16. Deep Neural Networks are Easily Fooled:High Confidence Predictions for Unrecognizable Images
  17. 几行代码爬取喜马拉雅音乐
  18. android手机图片和价格,安卓拍照手机强势推荐及报价【图文】
  19. php在线查毒,linux clamav 免费查毒工具
  20. 建站百科|「联系我们」页面设计指南(内附案例)

热门文章

  1. abaqus python二次开发攻略_Abaqus有限元分析常见问题解答与实用技巧 12天后上架...
  2. 萌新向Python数据分析及数据挖掘 第一章 Python基础 第三节 列表简介 第四节 操作列表...
  3. Redis-序列化和存储模式
  4. Java-JUC(一):volatile引入
  5. 「模拟赛20180307」三元组 exclaim 枚举+树状数组
  6. 获取request header的值
  7. 阿里mysql同步工具otter的docker镜像
  8. Android 使用AIDL实现进程间的通信
  9. Zabbix基本配置及监控主机
  10. Dockerfile 简版大全,附赠编写实例