我目前正在使用Moya来提出我的网络请求。我已经实施了以下示例项目之一@https://github.com/DroidsOnRoids/RxSwiftExamples#tutorials处理网络错误与绑定到tableView(Moya,RxSwift,RxCocoa)
下面我设置了restaurantSearch,以便有人输入文本时会发出新的请求。
var restaurantSearch: Observable<(String)> {
return searchBar
.rx_text
.throttle(0.5, scheduler: MainScheduler.instance)
.distinctUntilChanged()
}
我有一个返回可观察到的类型的方法[餐厅]
func restaurants() -> Observable<[Restaurant]> {
return restaurantSearch
.observeOn(MainScheduler.instance)
.flatMapLatest { postcode -> Observable<[Restaurant]?> in
return self.getRestaurants(postcode, cuisine: "", restaurantName: "")
}.replaceNilWith([])
}
internal func getRestaurants(postcode: String, cuisine: String, restaurantName: String) -> Observable<[Restaurant]?> {
return self.justEatProvider
.request(.Restaurant(postcode, cuisine, restaurantName))
.debug()
.mapArrayOptional(Restaurant.self, keyPath: "Restaurants")
}
我调用此方法,它结合到的tableView像这样:
func setupRx() {
api = JustEatApi(provider: provider, restaurantSearch: restaurantSearch)
api
.restaurants()
.bindTo(tableView.rx_itemsWithCellIdentifier("RestaurantTableViewCell", cellType: RestaurantTableViewCell.self)) { (row, element, cell) in
cell.restaurant = element
}
.addDisposableTo(disposeBag)
}
这是工作正常。如果我输入一个邮政编码,它会搜索并填充tableView。
如果我关闭互联网并尝试更改邮编,tableView保持不变。然而,当我把它的滚动崩溃我的应用程序如下:
@noreturn func rxFatalError(lastMessage: String) {
// The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.
fatalError(lastMessage)
}
另外,如果我没有做滚动,而是只是回头在互联网上,并更改邮政编码什么也没有发生。它似乎失去了它的约束力。
首先我试过bindTo
方法调用之前加入catchOnError但我在评论读到这里,它不应该作为UIBinding的一部分进行处理:http://blog.scottlogic.com/2014/05/11/reactivecocoa-tableview-binding.html
我猜我应该处理它的方法:
func restaurants() -> Observable<[Restaurant]> {
return restaurantSearch
.observeOn(MainScheduler.instance)
.flatMapLatest { postcode -> Observable<[Restaurant]?> in
return self.getRestaurants(postcode, cuisine: "", restaurantName: "")
}.replaceNilWith([])
}
所以我有2个问题:
1)式中,我应该如何处理网络错误?
2)为什么在我回到互联网后tableView不会更新?
任何帮助非常感谢。
尼斯之一!就我个人而言,当我使用视图模型时,我也在视图模型中使用了这个变量来通知有关错误,因此控制器可以将它作为一个独立单元进行监听。除此之外'APIResult'很棒,你也可以使用[Result](https://github.com/antitypical/Result)。 – sunshinejr