BridgeNet 0.1.0

BridgeNet 0.1.0

Alexey Pichukov维护。



BridgeNet 0.1.0

  • 作者:
  • pichukov

Bridge

CI Status Version License Platform

示例

要运行示例项目,克隆仓库,然后从示例目录运行pod install

安装

Bridge可以通过CocoaPods获取。要安装它,只需将以下行添加到Podfile中:

pod 'Bridge'

描述

Bridge是一个轻量级的库,用于实现应用内部的消息传递系统。它可以替代应用中的NotificationCenterObserver Observable模式。

我们可以将Bridge解释为一个无向图。图的每个节点都有一个TypeID。其中ID是一个唯一的UUID字符串,Type通常是一个enum或其他任何您偏好的用于存储的Hashable类型。

Bridge的主要思想是使消息传递系统灵活,不与特定实现耦合。为了保持这种灵活性,Bridge不存储图节点的邻接表或邻接矩阵。您不需要任何全局对象或Singleton来将消息从一个节点发送到另一个节点。您唯一需要知道的是目标Type。如果您有多个具有相同Type的节点,但想要将消息发送到特定的节点,您还必须指定目标节点的ID

例如,您在应用程序中有一个可以作为图片中表示的对象结构

Platform

节点类型

所有对象的类型都可以描述为枚举

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