Handling Netzwerkfehler in Kombination mit der Bindung an tableView (Moya, RxSwift, RxCocoa)

Ich benutze derzeit Moya, um meine Netzwerkanfragen zu stellen. Ich habe folgendes aus einem der Beispielprojekte implementiert @https: //github.com/DroidsOnRoids/RxSwiftExamples#tutorial

Nun habe ich restaurantSearch so eingerichtet, dass bei der Eingabe von Text eine neue Anfrage gestellt wird.

var restaurantSearch: Observable<(String)> {
    return searchBar
        .rx_text
        .throttle(0.5, scheduler: MainScheduler.instance)
        .distinctUntilChanged()
}

Ich habe eine Methode, die eine Observable vom Typ [Restaurant] @ zurückgib

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")
}

Ich rufe diese Methode auf und binde sie an eine tableView wie folgt:

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)
}

Dies funktioniert gut. Wenn ich eine Postleitzahl eingebe, wird die Suche ausgeführt und die tableView wird ausgefüllt.

Wenn ich das Internet ausschalte und versuche, die Postleitzahl zu ändern, bleibt die tableView unverändert. Beim Scrollen stürzt meine App jedoch folgendermaßen ab:

@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)
}

Auch wenn ich nicht scrolle sondern einfach wieder ins Internet schalte und die Postleitzahl ändere passiert nichts. Es scheint, als hätte es seine Bindung verloren.

Zunächst habe ich versucht, catchOnError vor dem @ hinzuzufügebindTo Methodenaufruf, aber ich habe hier im Kommentar gelesen, dass es nicht als Teil von UIBinding behandelt werden sollte:http: //blog.scottlogic.com/2014/05/11/reactivecocoa-tableview-binding.htm

Ich denke, ich sollte es in der Methode behandeln:

func restaurants() -> Observable<[Restaurant]> {
    return restaurantSearch
        .observeOn(MainScheduler.instance)
        .flatMapLatest { postcode -> Observable<[Restaurant]?> in
            return self.getRestaurants(postcode, cuisine: "", restaurantName: "")
        }.replaceNilWith([])
}

So habe ich 2 Fragen:

1) Wo und wie soll ich mit einem Netzwerkfehler umgehen?

2) Warum wird die tableView nicht aktualisiert, nachdem ich mich wieder im Internet angemeldet habe?

Jede Hilfe sehr geschätzt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage