前一篇:《终极懒加载一:多个子控制器框架ZJScrollPageView》
Github完整Demo
前言
在开发中遇到一种场景,数据是通过之前某个页面在发现某些设置或变化时从主Controller力发通知传递给子Controller的,但如果发通知时子Controller还没有创建,而子Controller在创建好后又因为没有新的变化一直接收不到通知导致一直没有数据,
这种场景下需要在子Controller创建时默认从主Controller里那一份数据,然后再当主Controller的数据有变化时主Controller发通知,然后子Controller更新数据并展示,通常这种场景下处理方式有如下几种:
方式一:
子Controller使用功能weak
持有主Controller,然后子Controller在初始化后通过持有的主Controller获取主Controller里的数据,具体实现方式每个人都知道,这里不具体展示代码了
方式二:
子Controller发送某个特定通知名的通知,然后主Controller里接受到这个通知后再将主Controller的数据再发一次数据更新通知,具体实现也很简单,但有个缺陷,那就是主Controller发送的通知所有字Controller都会接受并处理,这样会导致数据重复显示及浪费电量、内存,甚至处理不好会UI错乱
方式三
在方式二的基础上,将子Controller向主Controller要初始化数据的时候带上一个唯一的Key作为通知的object参数,然后主Controller在接收到这个请求初始化数据的通知后,取出object,再以这个Object作为Key反向发送通知,这样就可以实现一对一的通知不会影响其他的子Controller的内容与数据了,同时还给每次从主Controller里发送的数据更新通知做一个唯一编号,子Controller里在接收数据后比价下是否需要更新数据,具体实现见Github完整Demo:
3.1 子Controller请求初始化数据时发送的通知的object需要唯一,而每一个对象的地址本身就是唯一的,所以可以用对应子Controller的description再加上一些字符组成唯一的Key