iOS 基于NSPointerArray的一种组件化传值通信

前言 

因为之前所开发的项目规模逐渐变大,项目也通过组件化、依赖注入等方式解耦为各个小模块组件,各模块之前的关联也尽量拆分的越来越小。随着模块间层级越来越多,产品也可能会提出各种跨模块、跨业务的需求,相互之间也需要使用更加合理的通信传值方式,如果使用普通的赋值方式,或是委托代理,设置delegate、datasource等方式传值,很可能会造成魔鬼调用,非常不利于维护。

核心思路是依据观察者模式,参照系统通知中心NSNotificationCenter的实现方式,自定义消息注册、派发、移除中心。

NSPointerArray

类似NSArray 、NSMutableArray,不过可以再创建时设置其对存储对象的持有方式。NSPointerArray可以通过弱引用来持有内部数据,所以当数据被dealloc的时候,数组内的对象也会被移除。

弱引用持有value

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

数据结构



消息回调model结构
model结构

msgCallBack负责回调消息,其中的messageModel可以为通用消息体的基类。

messageType负责将callbackModel根据不同的消息key,存放在不同数组中。

在一个全局的Manager中(例如长链接、推送消息接收管理者) 添加对应的注册、移除、分发方法。

使用

注册、移除、派发

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


使用

因为我们内部是使用NSPointerArray弱引用持有callbackModel的,所以如果没有移除,也不会有影响,model会随着当前页面销毁而自动销毁。


可以看出对比于普通的使用通知或是层层代理,这种设计思路还是有比较大的优势的:

1.消息流向简单,便于开发及排查问题。

2.可以自定义callback消息的属性,增加唯一响应、响应优先级等通知不方便实现的功能。

3.类型声明直接,避免每个通知都要做一遍数据转换。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容