当前位置:首页 >百科 >一步步构建iOS路由 所以如何解决这个问题

一步步构建iOS路由 所以如何解决这个问题

2024-07-02 13:37:08 [百科] 来源:避面尹邢网

一步步构建iOS路由

作者:佚名 移动开发 iOS 路由层其实在逻辑上的步步设计都是一样的,关于对界面跳转的构建实现部分却与Android平台和iOS平台上的导航机制有着非常紧密的关系,Android操作系统有着天然的步步架构优势,Intent机制可以协助应用间的构建交互与通讯,是步步对调用组件和数据传递的描述,本身这种机制就解除了代码逻辑和界面之间的构建依赖关系,只有数据依赖。步步而iOS的构建界面导航和转场机制则大部分依赖UI组件各自的实现,所以如何解决这个问题,步步iOS端路由的构建实现则比较有代表性。

接上一篇移动端路由层设计

为啥要说iOS路由呢?步步

一步步构建iOS路由 所以如何解决这个问题

路由层其实在逻辑上的设计都是一样的,关于对界面跳转的构建实现部分却与Android平台和iOS平台上的导航机制有着非常紧密的关系,Android操作系统有着天然的步步架构优势,Intent机制可以协助应用间的构建交互与通讯,是步步对调用组件和数据传递的描述,本身这种机制就解除了代码逻辑和界面之间的依赖关系,只有数据依赖。而iOS的界面导航和转场机制则大部分依赖UI组件各自的实现,所以如何解决这个问题,iOS端路由的实现则比较有代表性。

一步步构建iOS路由 所以如何解决这个问题

其实说白一点,路由层解决的核心问题就是原来界面或者组件之间相互调用都必须相互依赖,需要导入目标的头文件、需要清楚目标对象的逻辑,而现在全部都通过路由中转,只依赖路由,或者依靠一些消息传递机制连路由都不依赖。其次,路由的核心逻辑就是目标匹配,对于外部调用的情况来说,URL如何匹配Handler是最为重要的,匹配就必然用到正则表达式。了解这些关键点以后就有了设计的目的性,let‘s do it~

一步步构建iOS路由 所以如何解决这个问题

设计类图: 

 

 

设计类图 

RouteClassMap.png

这里面有如下几个类:

  1. WLRRouteRequest,路由层的请求,无论是跨应用的外部调用还是内部调用,最后都形成一个路由请求,该请求包含了URL上的queryparameters和路径参数,还有内部调用时直接传入的原生参数,还有请求发起者对目标预留的回调block
  2. WLRRouteHandler,路由层的handler处理,handler接收一个WLRRouteRequest对象,来完成是否是界面跳转,还是组件加载,还是内部逻辑
  3. WLRRouter,路由核心对象,内部持有注册的Handler,比方说负责界面跳转的Handler,负责组件加载的Handler,负责API的Handler等等,路由的作用就是将外部调用传入的URL或者是内部调用传入的target,在内部匹配上对应的handler,然后调用生命周期方法,完成处理过程,当然,图中还有route的中间件,实际上是预留AOP的口子,方面后期扩展
  4. WLRRouteMatcher,用以处理外部调用的URL是否能与预设的正则表达式匹配,在WLRRouter中,每一次注册一个handler,都会用一个URL匹配的表达式生成一个WLRRouteMatcher
  5. WLRRegularExpression,继承NSRegularExpression,用以匹配URL,WLRRouteMatcher内部有一个WLRRegularExpression对象,WLRRouteMatcher接受一个URL,会使用WLRRegularExpression生成一个WLRMatchResult对象,来确定是否匹配成功,如果匹配成果则将URL上的路径参数给取出来
  6. WLRMatchResult,用以描述WLRRegularExpression的匹配结果,包含路径参数

工作流程:

  1. App启动实例化WLRRouter对象
  2. 实例化WLRRouteHandler对象
  3. WLRRouter对象挂载WLRRouteHandler实例与URL的表达式相对应,WLRRouter内部生成一个WLRRouteMatcher对象,与URL的表达式相对应
  4. 外部调用的URL和callback传入WLRRouter对象
  5. WLRRouter对象遍历内部持有的URL的匹配表达式,并找到每一个WLRRouteMatcher对象,将URL传入看是否能返回WLRRouteRequest对象
  6. 将WLRRouteRequest对象传入对应的WLRRouteHandler对象
  7. WLRRouteHandler对象根据WLRRouteRequest寻找到TargetViewController和SourceViewController,在生命周期函数里,完成参数传递与视图转场

WLRRouteRequest:

了解了以上,我们从WLRRouteRequest入手。

其实WLRRouteRequest跟NSURLRequest差不多,不过WLRRouteRequest继承NSObject,实现NSCopying协议,大概如下:

  1. #import 
  2.   
  3. @interface WLRRouteRequest : NSObject 
  4. //外部调用的URL 
  5. @property (nonatomic, copy, readonly) NSURL *URL; 
  6. //URL表达式,比方说调用登录界面的表达式可以为:AppScheme://user/login/138

    (责任编辑:热点)

    推荐文章
    热点阅读