如果使用 Combine 的网络调用 returns 错误,如何分配 nil
How to assign nil if network call returns error using Combine
我有一个具有默认值的变量。并进行网络调用以从服务器获取值。如果它 returns 有一些错误,那么我想将变量设置为 nil
。我如何使用 Future
、Promise
、Combine
执行此操作?
问题是 future
的 Output
是 Int
,所以你不能用 nil
替换错误,你需要用 Int
,因为上游发布者的 Output
和下游运营商的输入必须始终匹配。
您可以通过将 future
的 Output
映射到 Optional<Int>
来解决问题,然后您可以将错误替换为 nil
。
future
.receive(on: RunLoop.main)
.map(Optional.some)
.replaceError(with: nil)
.assign(to: &$count)
此外,assign(to:)
将 Published.Publisher
作为其输入,因此您需要使用 count
@Published
并传入其 Publisher
$count
到 assign
.
所以将声明更改为@Publised var count: Int? = 0
。
用 nil 值替换错误失败,因为你的 Future 发出了一个 Int
值。将其更改为可选 Int?
:
var count: Int? = 0
let future = Future<Int?, Error> { promise in
promise(.failure(DummyError()))
}.eraseToAnyPublisher()
init(){
future
.receive(on: RunLoop.main) //Getting error
.replaceError(with: nil)
.assign(to: &$count)
}
和 assign(to: &)
仅适用于 @Published
值。
我有一个具有默认值的变量。并进行网络调用以从服务器获取值。如果它 returns 有一些错误,那么我想将变量设置为 nil
。我如何使用 Future
、Promise
、Combine
执行此操作?
问题是 future
的 Output
是 Int
,所以你不能用 nil
替换错误,你需要用 Int
,因为上游发布者的 Output
和下游运营商的输入必须始终匹配。
您可以通过将 future
的 Output
映射到 Optional<Int>
来解决问题,然后您可以将错误替换为 nil
。
future
.receive(on: RunLoop.main)
.map(Optional.some)
.replaceError(with: nil)
.assign(to: &$count)
此外,assign(to:)
将 Published.Publisher
作为其输入,因此您需要使用 count
@Published
并传入其 Publisher
$count
到 assign
.
所以将声明更改为@Publised var count: Int? = 0
。
用 nil 值替换错误失败,因为你的 Future 发出了一个 Int
值。将其更改为可选 Int?
:
var count: Int? = 0
let future = Future<Int?, Error> { promise in
promise(.failure(DummyError()))
}.eraseToAnyPublisher()
init(){
future
.receive(on: RunLoop.main) //Getting error
.replaceError(with: nil)
.assign(to: &$count)
}
和 assign(to: &)
仅适用于 @Published
值。