将发布者组合分配给 PassthroughSubject

Ale*_*xZd 4 ios swift rx-swift combine

我有以下 RxSwift 视图模型代码:

private(set) var num = BehaviorRelay<Int>(value: 1)
private let indexTrigger = PublishRelay<Int>()
private let disposeBag = DisposeBag()

private func setupBindings() {
   //...
   self.num.distinctUntilChanged().bind(to: self.indexTrigger).disposed(by: self.disposeBag)
}

func numSelected(num: Int) {
   self.num.accept(num)
}

Run Code Online (Sandbox Code Playgroud)

这段代码运行良好并且达到了我想要的效果。我正在尝试做同样的事情,但是使用带有以下代码的快速组合框架:

@Published private(set) var num: Int = 1
private let indexTrigger = PassthroughSubject<Int, Never>()
private var subscriptions = Set<AnyCancellable>()

private func setupBindings() {
   //...
   self.$num.removeDuplicates().sink(receiveValue: { [weak self] num in
      self.indexTrigger.send(num)
   }).store(in: &self.subscriptions)
}

func numSelected(num: Int) {
   self.num = num
}
Run Code Online (Sandbox Code Playgroud)

所以 RxSwift 绑定看起来非常干净和简单,不需要弱。我尝试检查assign(on:)组合中的方法,但似乎不是那个方法。有办法做同样的事情吗?

Mic*_*nry 6

这是我对 绑定 所做的操作PassthroughSubject<Output, Failure>,使其类似于(并减少绑定目的不需要的闭包RxSwift数量)。sink

您可以简单地使用subscribe(subject: S)in 替换bind(to:)

请参阅此文档:https://developer.apple.com/documentation/combine/publisher/subscribe( _:)-3fk20

private func setupBindings() {
    //...
    self.$num.subscribe(indexTrigger).store(in: &subscriptions)
}
Run Code Online (Sandbox Code Playgroud)

就是这样。

干杯,凯尔