如何处理 Combine 的 Future 功能中取消发布商?

How do I handle cancelling of publishers in Combine's Future functions?

提问人:Joakim Sjöstedt 提问时间:7/4/2023 更新时间:7/5/2023 访问量:32

问:

在 中,您可以创建一个类似这样的响应式函数:RxSwift

func aFunc() -> Observable<Void> {
    return Observable.create({ emitter in
        let disposable = Observable
            .combineLatest(someObservable,
                           someOtherObservable)
                .subscribe(onNext: { responseA, responseB in
                    // do stuff
                })

                return Disposables.create {
                    disposable.dispose()
                }
            })
        }

您可以使用以下方法获得类似的结果:CombineFuture

func aFunc() -> Future<Void, Error> {
    return Future { promise in
        somePublisher
            .combineLatest(someObservable,
                           someOtherObservable)
                .sink{ responseA, responseB in
                    // do stuff
                }
            })
        }

我不太明白的是,它似乎没有返回它的等价物FutureRxSwift's

return Disposables.create {
    disposable.dispose()
}

如何处理发布商的处置/取消的标准做法?Future

我试着简单地添加:

_ = somePublisher...

但是,发布者不会保持活动状态,根本不会激活。 我应该挂在 .但是他们,我什么时候取消这些?或者有没有某种方法可以返回取消标签,例如在?我错过了什么?.store(in: &cancellables)publishercancellablesRxSwift

iOS版 Swift RX-Swift 组合 AnyCancellable

评论

1赞 Sweeper 7/4/2023
我不明白你想创造什么样的。它只发布一次吗?如果不是,则 a 不合适。即使有,为什么你需要一个可以操纵发布者呢?PublisherFutureFuturecombineLatest
1赞 Sweeper 7/4/2023
我不认为 Combine 旨在“处理内部的发布者”。当您可以直接对“内部”发布者进行操作时,您为什么要像这样“嵌套”发布者?这听起来很像一个 XY 问题。 与 不同。FutureFutureObservable.create
1赞 Sweeper 7/4/2023
不。 是一个非常具体的发布者,它要么发布一个元素,然后完成,要么引发错误。 比这要笼统得多FutureObservable.create
1赞 Sweeper 7/4/2023
也许这样说可以更清楚地说明为什么它们不一样 - takes 的闭包用于实现方法,但 takes 的闭包用于实现方法,我认为这在 RxSwift 中不是这样。另一方面,的实现是一种扩展方法,因此无法更改。Observable.createObservable.subscribe(_:)FuturePublisher.receive(subscriber:)Publisher.subscribe(_:)
1赞 Daniel T. 7/5/2023
更重要的是,未来是渴望的,一旦开始就无法处置/取消。这就是为什么它的创建者没有办法取消它。我同意 RxSwift 代码是荒谬的。只需使用您拥有的 Observables。

答:

1赞 Daniel T. 7/5/2023 #1

答案是,你没有。Combine Future 就像一个 RxSwift Single,一旦开始就无法取消。