我正在使用Swift Combine,没有区别
func subscribe<S>(_ subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input和
func subscribe<S>(_ subject: S) -> AnyCancellable where S : Subject, Self.Failure == S.Failure, Self.Output == S.Output为什么一个返回AnyCancellable而另一个返回Void
我有一个自定义的Subscriber,所以使用它是完全安全的吗
myPublisher.subscribe(myCustomSubscriber)而不必处理AnyCancellable
发布于 2020-09-04 17:30:18
更新
正如我在下面所解释的,您的自定义Subscriber (我在下面的代码中将其命名为MySubscriber )应该实现Cancellable协议。现在,您可以通过将订阅添加到Set<AnyCancellable>来管理订阅。当订阅被取消时,订阅也被取消。
我也有同样的担心。我有一个自定义的订阅者Subscribers.MySubscriber,并想添加功能Publisher.mySubscriber(),就像与Subscribers.Sink和Publisher.sink()的组合一样。但我不知道Publisher.sink()如何返回AnyCancellable。几分钟后,我想一个如何实现Publisher.sink()的解决方案:
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()时取消订阅,如下所示:
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()函数是:
extension Publisher {
public func mySubscriber() -> AnyCancellable {
let mySubscriber = MySubscriber<Output, Failure>()
subscribe(mySubscriber)
return AnyCancellable(mySubscriber)
}
}发布于 2019-12-20 22:29:09
一个需要Subscriber,另一个需要Subject。由于您的参数是订阅者,因此它将返回一个AnyCancellable。
现在,根据该行的作用域,您很可能需要保留该AnyCancellable对象的引用。可以直接调用,也可以通过调用store(:)来实现。您保留它,这样它就不会在任何输出或失败发布之前被释放。
https://stackoverflow.com/questions/59424964
复制相似问题