Swift: Return 发布者在另一个发布者完成后

Swift: Return publisher after another publisher is done

我对 Publishers 这个概念还很陌生,我正在 URLSession 上使用 dataTaskPublisher 创建网络服务。有一个刷新令牌的情况,我有一个 refreshToken() 方法 returns AnyPublisher<Bool, Never>:

    func refreshToken() -> AnyPublisher<Bool, Never> {
        var disposable = Set<AnyCancellable>()
        
        do {
            let request = URLRequest(url: URL(string: "refresh_token_url")!)
            URLSession.shared.dataTaskPublisher(for: request).sink { finished in
                /// Compiler error: Cannot convert value of type 'AnyPublisher<Bool, Never>' to closure result type 'Void'
                return Just(false).eraseToAnyPublisher()
            } receiveValue: { _ in
                /// What should I return here?
                return Just(true).eraseToAnyPublisher()
            }.store(in: &disposable)

        } catch {
            return Just(false).eraseToAnyPublisher()
        }
        
    }

编译器对两个 Just().eraseToAnyPublisher() 都报错。根据此刷新令牌调用的成功或失败,我不知道 return Just(false).eraseToAnyPublisher() 应该如何以及在何处。

此函数的调用者需要存储令牌 (AnyCancellable),因此不需要接收器(这就是您看到的错误的原因)。无需将发布者包装在 do-try-catch 块中。

这种方法可以编译:

func refreshToken() -> AnyPublisher<Bool, Never> {
    let request = URLRequest(url: URL(string: "refresh_token_url")!)
    return URLSession.shared
        .dataTaskPublisher(for: request)
        .map { _ in true }
        .replaceError(with: false)
        .eraseToAnyPublisher()
}

虽然一个叫做refreshToken的方法对return一个Bool没有多大意义。您应该解码响应,提取令牌并发布它 (AnyPublisher<String, Error>)。