Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Combine自定义发布服务器:存储对订阅服务器阵列的引用?_Swift_Combine - Fatal编程技术网

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