現在、Moya を使用してネットワーク リクエストを行っています。サンプル プロジェクト @ https://github.com/DroidsOnRoids/RxSwiftExamples#tutorialsの 1 つから以下を実装しました。
以下では、誰かがテキストを入力すると新しいリクエストが作成されるように、restaurantSearch をセットアップしました。
var restaurantSearch: Observable<(String)> {
return searchBar
.rx_text
.throttle(0.5, scheduler: MainScheduler.instance)
.distinctUntilChanged()
}
タイプ [Restaurant] のオブザーバブルを返すメソッドがあります。
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 が更新されないのはなぜですか?
どんな助けでも大歓迎です。