swift - Swift组合自定义发布者:存储对订阅者数组的引用?
问题描述
我正在尝试编写一个自定义组合,它将通过水龙头Publisher
发送分贝和时间戳。AVAudioEngine
在浏览了大量教程和 WWDC 视频之后,我仍然找不到一个示例来说明 a 如何Publisher
跟踪Subscriber
订阅它的 s。
public typealias AudioVolume = Double
public struct AudioVolumePublisher: Publisher {
public typealias Output = AudioVolume
public typealias Failure = Error
}
public class AudioVolumeSubscription<S: Subscriber>: NSObject, Subscription {
private var subscriber: S?
public var combineIdentifier = CombineIdentifier()
public init(for subscriber: S) {
self.subscriber = subscriber
}
public func request(_ demand: Subscribers.Demand) {
...
}
public func cancel() {
subscriber = nil
}
}
我假设AudioVolumePublisher
应该存储其活动订阅者的列表,但添加一个属性
var subscribers = [S]()
不会编译,因为Subscriber
有关联的类型。这甚至是处理Subscriber
s 的正确方法吗?如果是,那么存储它们的最佳方法是什么?类型擦除是我唯一实用的选择吗?
解决方案
您可以使用CurrentValueSubject
或来实现您的目标PassthroughSubject
。
假设这是您发送的形状:
struct AudioVolume {
let decimal: Decimal
let timestamp: TimeStamp
}
实例化主题
let audioPublisher = PassthroughSubject<AudioVolume, Never>()
每当您需要发布新值时:
let audioVolume = AudioVolume(....)
audioPublisher.send(audioVolume)
每当您需要订阅发布者时:
audioPublisher
.sink { audioVolume in
// do something with audioVolume
}
.store(in: &cancellables) // retain the subscription in cancellables as long as you want to remain subscribed
推荐阅读
- python - 在使用 Glade 创建的 Python GTK3 程序中导入 CSS 文件
- python - 在熊猫中选择带有startswith的列
- python - 我们如何使用 http 请求调用 GCP Composer DAG?
- angular - 嵌入式模板上的任何指令均未使用属性绑定 matFooterRowDef
- java - Pygame和Java JDK 13安装麻烦
- c++ - 犰狳中正确的对角矩阵
- flutter - 颤动中的错误:在 null 上调用了方法“文本”。接收方:本地化时为空
- reactjs - React Materialise Carousel 自动播放
- javascript - 它没有注册我将鼠标悬停在一个元素上
- javascript - 对象分配嵌套属性 Javascript