【发布时间】:2020-11-05 13:13:50
【问题描述】:
在我的视图控制器中,我有一个属性 items,我订阅并呈现我的视图。
对于这个视图控制器,我有一个视图模型,其中有如下加载方法:
@Published private(set) var items: [Item] = []
func load(params: [String: Any] = [:]) {
self.isLoading = true
self.subscription = WebRepo().index(params: params).sink(receiveCompletion: { [weak self] (completion) in
switch completion {
case .failure(let error):
print("Error is: \(error.localizedDescription)")
default: break
}
self?.isLoading = false
}, receiveValue: { [weak self] (response) in
self?.items = response.data
})
}
我的WebRepo 看起来像:
final class WebRepo {
func index(params: [String: Any]) -> AnyPublisher<MyResponse<[Item]>, Error> {
let url = URL(...)
return AF.request(url, method: .get, parameters: params)
.publishDecodable(type: MyResponse<[Item]>.self)
.tryCompactMap { (response) -> MyResponse<[Item]>? in
if let error = response.error { throw error }
return response.value
}
.eraseToAnyPublisher()
}
}
我的用户可以多次加载,如你所见,每次调用load方法时都会订阅,我认为不应该这样。
我尝试为我的视图模型引入属性:
private var indexResponse: AnyPublisher<MyResponse<[Item]>, Error>?
//And my load becomes
func load(params: [String: Any] = [:]) {
self.isLoading = true
self.indexResponse = WebRepo().index(params: params)
}
但在这种情况下,我无法进行初始绑定,因为初始值为 nil,因此它不会订阅。
另一个问题是关于处理来自加载的错误,我是否需要在视图模型中拥有error 的属性,或者有什么方法可以为$items 重新抛出错误?
【问题讨论】:
标签: ios swift alamofire combine