首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么subject(Subject)返回AnyCancellable,而subscribe(subscriber)无效?

为什么subject(Subject)返回AnyCancellable,而subscribe(subscriber)无效?
EN

Stack Overflow用户
提问于 2019-12-20 20:02:27
回答 2查看 454关注 0票数 1

我正在使用Swift Combine,没有区别

代码语言:javascript
复制
func subscribe<S>(_ subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input

代码语言:javascript
复制
func subscribe<S>(_ subject: S) -> AnyCancellable where S : Subject, Self.Failure == S.Failure, Self.Output == S.Output

为什么一个返回AnyCancellable而另一个返回Void

我有一个自定义的Subscriber,所以使用它是完全安全的吗

代码语言:javascript
复制
myPublisher.subscribe(myCustomSubscriber)

而不必处理AnyCancellable

EN

回答 2

Stack Overflow用户

发布于 2020-09-04 17:30:18

更新

正如我在下面所解释的,您的自定义Subscriber (我在下面的代码中将其命名为MySubscriber )应该实现Cancellable协议。现在,您可以通过将订阅添加到Set<AnyCancellable>来管理订阅。当订阅被取消时,订阅也被取消。

我也有同样的担心。我有一个自定义的订阅者Subscribers.MySubscriber,并想添加功能Publisher.mySubscriber(),就像与Subscribers.SinkPublisher.sink()的组合一样。但我不知道Publisher.sink()如何返回AnyCancellable。几分钟后,我想一个如何实现Publisher.sink()的解决方案:

代码语言:javascript
复制
extension Publisher {
    public func mySink(receiveCompletion: @escaping ((Subscribers.Completion<Self.Failure>) -> Void), receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable {
        let sink = Subscribers.Sink<Self.Output, Self.Failure>(receiveCompletion: receiveCompletion, receiveValue: receiveValue)
        subscribe(sink)
        return AnyCancellable(sink)
    }
}

因此,一个自定义的订阅者应该符合Cancellable,并保留订阅引用,以便在调用subsriber的cancel()时取消订阅,如下所示:

代码语言:javascript
复制
final class MySubscriber<Input, Failure: Error>: Subscriber, Cancellable {

    var subscription: Subscription?
    
    // ...
    
    init() {}

    func receive(subscription: Subscription) {
        // ...
        self.subscription = subscription
    }

    func receive(_ input: Input) -> Subscribers.Demand {
        // ...
        return .unlimited
    }

    func receive(completion: Subscribers.Completion<Failure>) {
        // ...
    }

    func cancel() {
        subscription?.cancel()
        subscription = nil
    }
}

所以我的函数Publisher.mySubscriber()函数是:

代码语言:javascript
复制
extension Publisher {
    public func mySubscriber() -> AnyCancellable {
        let mySubscriber = MySubscriber<Output, Failure>()
        subscribe(mySubscriber)
        return AnyCancellable(mySubscriber)
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-12-20 22:29:09

一个需要Subscriber,另一个需要Subject。由于您的参数是订阅者,因此它将返回一个AnyCancellable

现在,根据该行的作用域,您很可能需要保留该AnyCancellable对象的引用。可以直接调用,也可以通过调用store(:)来实现。您保留它,这样它就不会在任何输出或失败发布之前被释放。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59424964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档