前言
因为之前所开发的项目规模逐渐变大,项目也通过组件化、依赖注入等方式解耦为各个小模块组件,各模块之前的关联也尽量拆分的越来越小。随着模块间层级越来越多,产品也可能会提出各种跨模块、跨业务的需求,相互之间也需要使用更加合理的通信传值方式,如果使用普通的赋值方式,或是委托代理,设置delegate、datasource等方式传值,很可能会造成魔鬼调用,非常不利于维护。
核心思路是依据观察者模式,参照系统通知中心NSNotificationCenter的实现方式,自定义消息注册、派发、移除中心。
NSPointerArray
类似NSArray 、NSMutableArray,不过可以再创建时设置其对存储对象的持有方式。NSPointerArray可以通过弱引用来持有内部数据,所以当数据被dealloc的时候,数组内的对象也会被移除。

相似的还有NSHashTable和NSMapTable,分别对应NSSet和NSDictionary。
数据结构


msgCallBack负责回调消息,其中的messageModel可以为通用消息体的基类。
messageType负责将callbackModel根据不同的消息key,存放在不同数组中。
在一个全局的Manager中(例如长链接、推送消息接收管理者) 添加对应的注册、移除、分发方法。
使用

之后,我们就可以在项目中任意地方使用

因为我们内部是使用NSPointerArray弱引用持有callbackModel的,所以如果没有移除,也不会有影响,model会随着当前页面销毁而自动销毁。
可以看出对比于普通的使用通知或是层层代理,这种设计思路还是有比较大的优势的:
1.消息流向简单,便于开发及排查问题。
2.可以自定义callback消息的属性,增加唯一响应、响应优先级等通知不方便实现的功能。
3.类型声明直接,避免每个通知都要做一遍数据转换。