我目前有一个类型为AnyPublisher<[MyClass], Error>
的发布者,我试图将其附加到订阅者并捕获生成的AnyCancelable
。 Xcode的自动完成功能说我应该可以做到,但是当实际输入代码时,我遇到一个编译器错误,指出返回的类型不是AnyCancelable
,而是()
这是我的代码示例:
let networkController = NetworkController()
let viewState = MyViewState()
let publisher: AnyPublisher<[MyClass], Error> = networkController.createPublisher()
let cancelable: AnyCancellable = publisher.subscribe(viewState)
Cannot convert value of type '()' to specified type 'AnyCancellable'
我的目标是在Combine Framework中包装一个现有的异步函数,该函数可以被调用很多次,这样我可以有一种很好的方法,使请求在重新分配时被取消,就像这样:
... self.cancelable = cancelable
答案 0 :(得分:0)
AnyPublisher
具有两个 subscribe
方法,用于将Subscriber
附加到Publisher
。它都继承自Publisher
协议。他们在这里:
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
因此,我想您的MyViewState
类型不符合Subject
协议。因此,您不能使用返回subscribe
的{{1}}版本。
AnyCancellable
是Subject
的子协议,它公开用于注入值的Publisher
方法,然后由send
发布。您是否希望您的Subject
类成为MyViewState
?我怀疑不是。
您可能想要做的是将Publisher
类型更改为甚至不符合MyViewState
。而是使用Subscriber
的{{1}}方法(也从AnyPublisher
继承)将发布者连接到您的sink
。 Publisher
方法返回符合viewState
的{{1}}对象:
sink
如果需要,可以将返回的Sink
包装在Cancellable
中。因此:
func sink(
receiveCompletion: ((Subscribers.Completion<Failure>) -> Void)? = nil,
receiveValue: @escaping ((Output) -> Void))
-> Subscribers.Sink<Output, Failure>