订阅返回的Void而不是AnyCancelable

时间:2019-07-04 20:14:46

标签: swift combine

我目前有一个类型为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

1 个答案:

答案 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}}版本。

AnyCancellableSubject的子协议,它公开用于注入值的Publisher方法,然后由send发布。您是否希望您的Subject类成为MyViewState?我怀疑不是。

您可能想要做的是将Publisher类型更改为甚至不符合MyViewState。而是使用Subscriber的{​​{1}}方法(也从AnyPublisher继承)将发布者连接到您的sinkPublisher方法返回符合viewState的{​​{1}}对象:

sink

如果需要,可以将返回的Sink包装在Cancellable中。因此:

func sink(
    receiveCompletion: ((Subscribers.Completion<Failure>) -> Void)? = nil,
    receiveValue: @escaping ((Output) -> Void))
    -> Subscribers.Sink<Output, Failure>