HJMediator 0.1.0

HJMediator 0.1.0

houwenjie维护。



  • houwenjie

HJMediator

最近结合自己的项目,创建了一个简单的页面跳转中介者框架。

前言

项目最初没有使用中介者模式进行页面跳转,结果跳转代码散落在各个地方,显得非常混乱。到了后来,我们在进行埋点、开发混合应用时,感到非常绝望,每个跳转点都需要添加相同的代码块,也因此出现过遗漏代码块导致的 bug。

我们使用中介者模式进行页面创建和跳转,一方面可以进行页面解耦,另一方面也可以在入口进行统一的逻辑判断和处理,甚至为以后的组件化开发提供了一个很好的入口。以下是我的一些思路:

  1. 支持对不同的 UIViewController 进行个性化的初始化。
  2. 允许 UIViewController 发出回调给回调者。
  3. 允许外部调用 UIViewController 的方法。

以上是我认为这个框架需要满足的几个需求,当然,在实际开发中,还包括但不限于这些需求。我认为,一个适合大家自己项目的框架才是好框架。

类图

这是框架的类图,有两个简单的类:类图图片

HJMediatorManager 类,负责具体的跳转逻辑,跳转方法还可以扩展,例如可以增加跳转动画类型等参数。

VCMediator 类,负责生成具体的 ViewController,并在内部维护一个 ViewController 的引用,并支持通过 VCMediator 对 ViewController 进行方法调用。VCMediator 初始化时,实际上是通过运行时生成并返回的具体的子类,通过这样,ViewController 就不需要知道具体的子类,从而实现了解耦。

使用方法

我们每次创建一个 ViewController,都对应的创建一个 VCMediator 子类,这个子类负责实现具体的 ViewController 生成方法:

- (BaseVC *)setTargetVCParameters:(id)parameters
{
    /// 在这个方法内做 VC 的具体初始化
    VCA *vc = [[VCA alloc] initWithName:parameters[@"name"]];
    return vc;
}

这个方法需要子类去实现,因为不同的 ViewController,可能有不同的初始化方法,无法在父类 VCMediator 中进行统一处理。或者,虽然真的有办法去做统一处理,但是为了体现出我们的解耦操作,或者以后单独对某个 ViewController 进行相应的处理,我觉得有必要单独生成一个子类。

在操作 push ViewController 时,通过对中介者进行操作,实现页面的跳转。

VCMediator *mediator = [VCMediator VCMediatorWithName:@"A" parameters:nil];
if (indexPath.row == 0) {
    [HJMediatorManager pushVCWithMediator:mediator navController:self.navigationController];
    
}
else
{
    [HJMediatorManager presentVCWithMediator:mediator mainController:self];
}
    

更多

框架中只是简单地包含了逻辑,演示了基本思路,但具体细节处理还有很多不足,比如错误判空处理,以及针对 VC 的初始化可以建立一个统一的入口逻辑处理等,总之,这是一个需要根据个人需求进一步完善的项目。