Bridge
示例
要运行示例项目,克隆仓库,然后从示例目录运行pod install
。
安装
Bridge可以通过CocoaPods获取。要安装它,只需将以下行添加到Podfile中:
pod 'Bridge'
描述
Bridge
是一个轻量级的库,用于实现应用内部的消息传递系统。它可以替代应用中的NotificationCenter
或Observer Observable
模式。
我们可以将Bridge
解释为一个无向图。图的每个节点都有一个Type
和ID
。其中ID
是一个唯一的UUID
字符串,Type
通常是一个enum
或其他任何您偏好的用于存储的Hashable
类型。
Bridge
的主要思想是使消息传递系统灵活,不与特定实现耦合。为了保持这种灵活性,Bridge不存储图节点的邻接表或邻接矩阵。您不需要任何全局对象或Singleton
来将消息从一个节点发送到另一个节点。您唯一需要知道的是目标Type
。如果您有多个具有相同Type
的节点,但想要将消息发送到特定的节点,您还必须指定目标节点的ID
。
例如,您在应用程序中有一个可以作为图片中表示的对象结构
节点类型
所有对象的类型
都可以描述为枚举
enum NodeType: BridgeNodeTypable {
case root
case blue
case green
case red
}
节点持有实现
所有希望通过桥
发送和接收消息的对象都应该确认几个协议
BridgeNodeConnectable
用于将节点相互连接的能力BridgeCallable
用于实现接收功能
例如,这个简单的UIView
就可以展示图片中的红色节点
class RedView: UIView {
var bridgeNode: BridgeNode<NodeType>?
func initBridge() {
bridgeNode = BridgeNode<NodeType>(withAddress: BridgeNodeAddress<NodeType>(withAutogeneratedIdAndType: .red))
bridgeNode?.add(delegate: self)
}
}
extension RedView: BridgeNodeConnectable {}
extension RedView: BridgeCallable {
func recieve<NodeType>(message: BridgeMessage<NodeType>) {
guard let color = message.value as? UIColor else { return }
backgroundColor = color
}
}
该视图只是从其他节点接收消息,并根据从消息中获取的颜色改变自己的背景颜色。
节点连接的功能已通过BridgeNodeConnectable
协议扩展实现。
重要:当您创建
BridgeNode
元素时,也可以为其指定工作队列和完成队列。默认情况下,Bridge
使用自己的并发DispatchQueue
作为工作队列,使用主队列作为完成队列。消息传输过程中的线程安全性由内部架构保证,但仅在使用同一线程为每个BridgeNode
元素的情况下。
消息发送
要通过桥
发送任何信息,您需要创建BridgeMessage
对象。对于此消息,您必须指定
- 消息的源节点
- 目标节点
- 您要发送的数据
- 目标对象在接收到消息后可调用的可选回调
如果要向特定类型的所有节点发送消息,可以创建它,如下所示
let message = BridgeMessage<NodeType>(fromSourse: bridgeNode!.address,
toDestination: BridgeNodeAddress<NodeType>(withOnlyType: .red),
withValue: UIColor.white)
要创建此类型中特定节点的消息,也必须指定ID
要发送消息,请从BridgeNode
对象调用send
bridgeNode!.send(message: message)
作者
Alexey Pichukov , [email protected]
许可协议
桥梁软件在MIT许可下提供。更多信息请参阅LICENSE文件。