SwiftBus

一个简单轻量级的事件总线库,使用 Swift 编写并由 Combine 驱动

入门

Swift Package Manager

你可以通过将 SwiftBus 添加为 Package.swift 文件中的依赖项,将其添加到你的项目中

// swift-tools-version:5.7
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "MyProject",
    products: [
        .library(name: "MyProject", targets: ["MyProject"])
    ],
    dependencies: [
         .package(url: "https://github.com/mtynior/SwiftBus.git", .upToNextMajor(from: "1.0.0")),
    ],
    targets: [
        .target(name: "MyProject", dependencies: ["SwiftBus"]),
        .testTarget(name: "MyProjectTests", dependencies: ["MyProject"])
    ]
)

Xcode

在 Xcode 中打开你的项目,然后

  1. 点击 File -> Add Packages,
  2. 在搜索栏中输入:https://github.com/mtynior/SwiftBus.git 并按下 Enter
  3. 一旦 Xcode 找到该库,将 Dependency rule 设置为 Up to next major version,
  4. 点击 Add Package,
  5. 选择所需的目标 (如果你有多个目标,你可以从 Xcode 手动添加依赖项)
  6. 通过点击 Add Package 确认选择。

TL;DR

SwiftBus 允许发送和接收符合空 EventRepresentable 协议的自定义事件

import SwiftBus
import Combine

// 1. Define custom event
struct RebelsActivityDetectedEvent: EventRepresentable {
    let planet: String
    let distanceInParsecs: Int
}

// 2. Create EventBus
let eventBus: EventTransmittable = EventBus()
var subscriptions: Set<AnyCancellable> = []

// 3. Add event handlers and store the reference to a subscription
eventBus.onReceive(RebelsActivityDetectedEvent.self) { event in
  print("Detected rebels \(event.distanceInParsecs) parsecs from us on \(event.planet)")
}
.store(in: &subscriptions)

// 4. Send event
let event = RebelsActivityDetectedEvent(planet: "Hoth", distanceInParsecs: 12)
eventBus.send(event)

命名事件

如果你不想使用自定义事件结构,你可以发送和接收命名事件

import SwiftBus
import Combine

// 1. Create EventBus
let eventBus: EventTransmittable = EventBus()
var subscriptions: Set<AnyCancellable> = []

// 2. Add handler for named event with params
eventBus.onReceive("RebelsActivityDetected") { params in
  print("Detected rebels \(params["distanceInParsecs"]) parsecs from us on \(params["planet"])")
}
.store(in: &subscriptions)

// 3. Add handler for named event without params
eventBus.onReceive("JumpedToHyperspace") { _ in
  print("Jumped to hyperspace")
}
.store(in: &subscriptions)

// 4. Send named event with params
eventBus.send("RebelsActivityDetected", params: ["planet": "Hoth", "distanceInParsecs": 12])

// 5. Send named event without params
eventBus.send("JumpedToHyperspace")

在不同线程上接收事件

默认情况下,事件在用于发送事件的同一线程上接收。SwiftBus 允许切换用于接收事件的线程

// Receive event on Main Thread
eventBus.onReceive(RebelsActivityDetectedEvent.self, performOn: DispatchQueue.main) { _ in
  print("This will be executed on the main thread")
}
.store(in: &subscriptions)

// Receive event on Background Thread
eventBus.onReceive("JumpedToHyperspace", performOn: DispatchQueue.global(qos: .background) { _ in
  print("This will be executed on the background thread")
}
.store(in: &subscriptions)

许可

SwiftBus 在 MIT 许可下发布。有关详细信息,请参阅 LICENSE。