由于团队希望项目能够去 CoreData 化,而以往状态同步都是依赖于 CoreData 的NSFetchedResultsController。因此去 CoreData 则必须寻找一种替代方案来进行状态同步。 NotificationCenter 状态同步实际是一对多的场景,也就是一个事件可以被多个观察者监听到。而苹果的系统框架自带的 NotificationCenter 正是用来适配这种场景,并且其也是被系统框架本身及我们开发者大面积使用的。用法如下: 定义通知名字,以及需要额外传递信息的
由于团队希望项目能够去 CoreData 化,而以往状态同步都是依赖于 CoreData 的NSFetchedResultsController。因此去 CoreData 则必须寻找一种替代方案来进行状态同步。
NotificationCenter
状态同步实际是一对多的场景,也就是一个事件可以被多个观察者监听到。而苹果的系统框架自带的 NotificationCenter 正是用来适配这种场景,并且其也是被系统框架本身及我们开发者大面积使用的。用法如下:
定义通知名字,以及需要额外传递信息的 key 基于 target-action 的方式注册通知实现监听通知的方法
发送通知,可以传递发送通知的对象(object)以及一些额外的信息(userInfo)
移除注册的通知
当然 NotificationCenter 也提供了一种更加便利基于 block 的方式注册监听通知,其将 2,3 两个步骤整合为 1 个步骤。
整体流程很清晰,简单易用,但是却有一个严重的缺点 —— 弱类型。我们接收到的是一个NSNotification对象。
假设我们需要传递一个关注状态改变的信息,那么需要包含关注更改后的状态以及被关注者的 ID。那么我们需要从 userInfo 中取出所需要的值:
也就是说接收通知的一方一般需要要查看文档才知道怎样从 userInfo 取值,取的值的类型又是什么。这对于使用是极为不方便的。
SwiftNotificationCenter
SwiftNotificationCenter是一种面向协议的通知中心方案。使用方式如下:
定义协议
基于协议注册通知
实现协议方法
发送通知
移除注册的通知
我们可以看到,tpwallet官网其基于协议的方式解决了弱类型的问题, tp钱包官网下载app安卓版最新版本并且其通过AssociatedObject实现了通知的自动移除。但其也存在着扩展性较差的问题。
依然是关注改变的场景,假如随着业务的发展,有的地方需要知道关注后是否为互关的状态,那么又需要增加一个字段来标识。因此我们需要修改协议,增加参数,且由于其不是必须传递的参数,因此是 optional 类型。
如果在该类型通知被广泛应用的场景,那么需要修改的地方就尤其多了。这显然也是难以接受的。
EventBus
EventBus 在安卓中被广泛地应用,其流程如下图所示:
图片来源:EventBus
使用方式如下:
定义事件
https://www.heartsys.cn注册事件
实现监听事件的方法
发送事件
移除事件的注册
我们可以看到, EventBus 也是强类型的。
假如依然关注的场景,需要增加 followingEachOther 参数,那么我们只需要在 TPFollowingChangedEvent 中增加 followingEachOther 参数即可。如下所示:
因此使用 EventBus 实现了以下需求:
强类型 可扩展EventBus 同 NotificationCenter 都是基于 target-action 的方案,但是我们不难将其扩展为支持 block 监听的方式,并且同样让其能够自动移除事件的注册。类似于如下的使用方式:
基于 OC, 我实现了一个小巧但比较全面的 EventBus 供参考:TPEventBus。
最后
我们可以看到,一对多场景中观察者模式的应用流程都大同小异,但是如何更好用确是值得深思的。当然以上也只是我在一些使用场景上的思考,肯定会欠缺考虑,欢迎拍砖:blush:。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
第一步:打开IJKMediaPlayer,找到Edit Scheme,在Info选项下的Build Configuration中选择Release后关闭窗口。 第二步:分别在模拟器和真机下编译IJKMediaPlayer,并找到模拟器和真机对应的IJKMediaFramework.framework。 如下所示: https://www.lianhuahb....
由于团队希望项目能够去 CoreData 化,而以往状态同步都是依赖于 CoreData 的NSFetchedResultsController。因此去 CoreData 则必须寻找一种替代方案来进行状态同步。 NotificationCenter 状态同步实际是一对多的场景,也就是一个事件可以被多个观察者监听到。而苹果的系统框架自带的 Notificati...
币安 MegaDrop 简介 什么是币安 MegaDrop? 币安 Megadrop 是一个全新的代币发行平台,将币安赚币产品与币安 Web3 钱包无缝整合,重新定义了空投体验。通过 Megadrop,用户可以抢先参与尚未在币安正式上线的精选 Web3 项目。 Megadrop 以独特的方式将参与、学习和奖励相结合,为币安平台乃至整个加密货币生态用户带来了前...
chainlink(加密:link)oracle硬币在12月17日的52周中翻了一番,这是这次激增的峰值。 加密货币市场在2024年处于滚动状态,但近几个月来,许多领先的名字都退缩了。 Chainlink(加密:Link)Oracle硬币在12月17日的52周内翻了一番,这是这次激增的峰值。硬币的价格从4月2日下降到了43%的著作。相比之下,大型比特币(Cr...
WinRAR是一款支持广泛格式使得用户无需安装多个压缩软件就能处理各种格式的压缩包软件,大大简化了操作流程。用户可以将大文件分割成多个小文件,方便存储和传输。WinRAR提供了密码保护功能,用户可以为压缩文件设置密码,确保文件的安全性。接下来就让华军小编为大家解答一下winrar怎么设置线程以及winrar设置线程的方法吧! 第一步 在电脑上启动WinRAR...