В настоящее время я использую Moya для выполнения сетевых запросов. Я реализовал следующее из одного из примеров проектов @ https://github.com/DroidsOnRoids/RxSwiftExamples#tutorials
Ниже я настроил 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)
}
Также, если я не прокручиваю, а просто включаю Интернет и меняю почтовый индекс, ничего не происходит. Похоже, он потерял привязку.
Сначала я попытался добавить catchOnError перед вызовом метода bindTo
, но я прочитал здесь в комментарии, что он не должен обрабатываться как часть 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 не обновляется после того, как я снова подключусь к Интернету?
Любая помощь очень ценится.