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>
)。
我对 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>
)。