读URLNavigator源码

栏目: IOS · 发布时间: 5年前

内容简介:Router的主要作用是解耦。之前在各个ViewController间跳转,需要import ViewController,这样就造成ViewController之间的依赖,也即耦合。通过router不需要再import ViewController。所有的只要import router,只依赖router这一个类,router里再去import 其他的ViewController,这样,就达到我们说的解耦。一个基本完善的router,我认为应该有下面几个核心功能:

URLNavigator 是Swift版本的Router。

Router的主要作用是解耦。之前在各个ViewController间跳转,需要import ViewController,这样就造成ViewController之间的依赖,也即耦合。通过router不需要再import ViewController。所有的只要import router,只依赖router这一个类,router里再去import 其他的ViewController,这样,就达到我们说的解耦。

一个基本完善的router,我认为应该有下面几个核心功能:

  • 跳转ViewController

  • 跳转服务

  • 回传值

跳转ViewController是基本功能,这里包括跳转的时候,传入参数。

对于跳转,我们需要做到通过一个字符串,来跳转到我们想要的页面,那么我们首先要做的是将字符串和对应的页面关联起来,到时候,你给我这个字符串,我就知道你需要去哪个页面。

在URLNavigator里有一个注册方法,就是将字符串和需要跳转的ViewController关联起来。

navigator.register("navigator://user") { url, values, context in
      return UserViewController()
    }

更进一步,可以在字符串里把需要传递的参数也带上

navigator.register("navigator://user/
<username>
 ") { url, values, context in
      guard let username = values["username"] as? String else { return nil }      return UserViewController(navigator: navigator, username: username)
    }
</username>

这样不仅可以跳转到关联页面,还能传递参数。

register里面做的事很简单,就是用一个字典将字符串和和ViewController关联起来。

public typealias URLPattern = String
private var viewControllerFactories = [URLPattern: ViewControllerFactory]()
open func register(_ pattern: URLPattern, _ factory: @escaping ViewControllerFactory) {
    self.viewControllerFactories[pattern] = factory
  }

将字符串作为字典的key,创建ViewController的闭包作为value,就这样关联了字符串和ViewController。

在调用的时候,再根据字符串找到相应的闭包,得到ViewController,执行跳转动作。

open func viewController(for url: URLConvertible, context: Any? = nil) -> UIViewController? {
    let urlPatterns = Array(self.viewControllerFactories.keys)
    guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }
    guard let factory = self.viewControllerFactories[match.pattern] else { return nil }
    return factory(url, match.values, context)
  }

从viewControllerFactories字典里拿到factory,再执行factory(url, match.values, context)。

这里的guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }是拿到url里的参数,这里面参数的传入有一个自己定义的规则。URLMatcher.swift就是专门处理字符串的拆分,拿到参数。

然后

navigator.push("navigator://user/zhangsan")
navigator.present("navigator://user/zhangsan")

调用服务,有时候,我们并不想跳到一个页面,仅仅是想调用某个类里面的某个函数。

navigator.register("navigator://user/
<username>
 ") { url, values, context in
      guard let username = values["username"] as? String else { return nil }
      return UserViewController(navigator: navigator, username: username)
    }
</username>

这个是上面的注册代码,我们只要修改一下就可以了,调用服务,其他的操作一样

navigator.register("navigator://user/
<username>
 ") { url, values, context in
      guard let username = values["username"] as? String else { return nil }
      //获取UserViewController对象 userVC,调用方法
        userVC.callFuc(username: username)
    }
</username>

这个是我假想的一个方法。实际有一个和register类似的方法

private var handlerFactories = [URLPattern: URLOpenHandlerFactory]()
open func handle(_ pattern: URLPattern, _ factory: @escaping URLOpenHandlerFactory) {
    self.handlerFactories[pattern] = factory
  }

有一个保存闭包和字符串对应关系的字典handlerFactories,不和register字典共用。

所以调用方法是

navigator.handle("navigator://user/
<username>
 ") { (url, values, context) -> Bool in
      guard let username = values["username"] as? String else { return nil }
      //获取UserViewController对象 userVC,调用方法
        userVC.callFuc(username: username)
      return true
    }
</username>

回传值,有时候,我们跳转到某个页面,需要这个页面执行后,把相关结果返回。

目前,URLNavigator还没有第三个功能。

总结一下:自己定义一个字符串规则,包含页面信息和参数信息,然后将字符串和对应的闭包关联起来,闭包可以是创建相应ViewController的操作,也可以是调用函数的操作,也可以是其他操作。在router通过字符串跳转的时候,拿到字符串,解析出参数,找到相应的闭包,将参数传给闭包执行,执行闭包得到的ViewController,拿去跳转。

作者:桔子听

链接:https://www.jianshu.com/p/d58e77dbaa33


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Information

The Information

James Gleick / Vintage / 2012-3-6 / USD 16.95

James Gleick, the author of the best sellers Chaos and Genius, now brings us a work just as astonishing and masterly: a revelatory chronicle and meditation that shows how information has become th......一起来看看 《The Information》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具