Swift Combine自定义发布服务器:存储对订阅服务器阵列的引用?
我正在尝试编写一个定制的组合Swift Combine自定义发布服务器:存储对订阅服务器阵列的引用?,swift,combine,Swift,Combine,我正在尝试编写一个定制的组合Publisher,它将从AVAudioEnginetap发送分贝和时间戳。在阅读了大量教程和WWDC视频后,我仍然找不到一个例子说明出版商如何跟踪订阅了它的订阅者 public typealias AudioVolume = Double public struct AudioVolumePublisher: Publisher { public typealias Output = AudioVolume public typealias Fai
Publisher
,它将从AVAudioEngine
tap发送分贝和时间戳。在阅读了大量教程和WWDC视频后,我仍然找不到一个例子说明出版商如何跟踪订阅了它的订阅者
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
}
}
无法编译,因为订阅服务器具有关联的类型。这是处理订户的正确方法吗?如果是,存储订户的最佳方法是什么?类型擦除是我唯一实用的选择吗?您可以使用或实现您的目标
假设这是您要发送的形状:
struct AudioVolume {
let decimal: Decimal
let timestamp: TimeStamp
}
实例化主题
let audioPublisher = PassthroughSubject<AudioVolume, Never>()
每当您需要订阅发布服务器时:
audioPublisher
.sink { audioVolume in
// do something with audioVolume
}
.store(in: &cancellables) // retain the subscription in cancellables as long as you want to remain subscribed
你为什么不看看操作符是如何实现的呢?不过,对于多个订户s,这是如何实现的呢?我可以简单地调用audioPublisher.sink()
多次吗Publisher
是一个协议,因此它无法跟踪订阅者本身,但是sink()
的实现必须做一些事情来保持连接处于活动状态。而Cancelables
的类型是什么?@n它的PassthroughSubject是一个类,它具有引用类型语义,如果您订阅了多个订阅者,如果你明白我的意思的话,它一直在滴答作响。是的,你可以使用sink
或任何其他联合收割机操作员订阅任意次数<代码>可取消项
是类型设置
。
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