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文件。
