聊聊AppDelegate解耦

本文探讨了iOS开发中AppDelegate的痛点,如代码堆积和高耦合,以及组件化面临的挑战。通过引入QTEventBus,实现了AppDelegate的解耦,详细介绍了其使用教程、工作原理,并提供了注册和事件响应的实现方式。QTEventBus基于总线设计模式,简化了事件通知,支持事件直接传达至相关类,提高了代码的可维护性和组件化能力。
摘要由CSDN通过智能技术生成

AppDelegate

在iOS开发中,AppDelegate指的是UIApplicationDelegate,用来处理App层面的事件,包括生命周期变化,OpenURL,处理HandOff和Intent等。

每个iOS都有一个入口函数main,其中的一个参数就是AppDelegate:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([QTAppDelegate class]));
    }
}

痛点

由于AppDelegate是一个单例,所以通常写代码的方式:

  1. import对应的业务类进来
  2. 实现对应Delegate的方法,然后调用业务类
#import "TokenService.h"
....
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    [TokenService update:deviceToken];
}

乍一看这也没什么问题,但是随着时间的推移:

  • didFinishLaunchingWithOptions堆积了越来越多的代码,有些时候这些代码还有先后顺序,比如Crash收集代码就要最早初始化。
  • 由于不同的模块负责处理不同的功能,比如路由模块处理OpenURL,Siri模块处理Intent….,结果就是这个文件import的类和模块越来越多,文件越来越臃肿。

日积月累:这个文件耦合越来越严重,越来越难以迭代和维护

组件化

组件化是一个很热的概念,但并不是每个App都适合组件化,适不适合组件化要写的内容太多,以后有时间了再聊聊这方面。我们先来聊聊组件化需要翻过的几座大山:

App层面的事件如何通知到各个组件。这些事件包括应用内部的全局事件和系统层面的AppDelegate事件。

组件之间如何相互调用。通常有几种解决方案:

  1. 每个组件暴露抽象的协议或者抽象类出来,由一个中介者去负责创建和协调。
  2. 通过路由URL来相互调用。
  3. 暴露特定的类和方法出来,通过Target/Action的方式来调用。

组件之间的页面跳转。解决方案基本都是路由,通过URL来注册和跳转,路由还可以统一处理内跳和外跳。

可见,如果你想要组件化,那么对AppDelegate解耦是必须解决的问题

QTEventBus

AppDelegate解耦的核心:如何让事件通知到每个模块?

如果仅仅通知到模块,模块内部还要自己处理分发,如果支持事件可以直接通知到相关的类就更好了。

这种一对多的消息通知关系,用总线设计模式可以完美解决,所以本文的解决方案是建立在QTEventBus上的。

关于如何实现一个总线,参考我的上一篇文章:《实现一个优雅的iOS消息总线

使用教程

安装:

pod QTEventBus/AppModule

QTAppDelegate替代默认的AppDelegate,修改main.m

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值