私は RxSwift と RX の全体的な概念に不慣れで、RxSwift によってリモート サーバーからフェッチされたグローバル アプリケーション状態を処理する方法を知りたいです。
JSON をフェッチし、それをオブジェクトのリストに解析してテーブル ビューに表示する必要があると仮定しましょう。また[{id: object}, ...]
、アプリケーションの他のセクションでデータを使用するフォーマットでマップを作成する必要もあります。
例: アプリはサーバーから人物リストを繰り返し取得し、関連するメッセージでアバターとステータスを表示する人物メッセージと同様に人物テーブル ビューのデータを必要とします。したがって、データはビュー モデルに必要でPersonViewModel
ありMessageViewModel
、モデル Person および Message によって構成されます。
そのような構造を持つ正しい方法は次のとおりです。
struct Person {
let id: personId
let fullName: String
let status: personStatus
}
class PeopleStore {
var order: [personId] = []
var dataMap: [personId: Person] = [:]
init(people: [Person]) {
order = people.map { $0.id }
for person in people {
dataMap[person.id] = person
}
}
}
class AppState {
let rx_peopleStore: Variable<PeopleStore>
init(peopleStore: PeopleStore) {
self.rx_peopleStore = Variable(peopleStore)
}
}
サーバーから取得してアプリの状態を調整するには:
...
_ = PeopleApi
.rx_peopleStore
.asDriver(onErrorJustReturn: [])
.driveNext { peopleStore in
sharedAppState.rx_peopleStore.value = peopleStore
}
...
そしてviewModelsで:
...
_ = sharedAppState
.rx_peopleStore
.asDriver()
.driveNext { store in
// refreshUI by data from store
}
.addDisposableTo(bag)
...
これは正しい方法ですか、それとも別のより良いアプローチが存在しますか? また、(将来)フェッチされたデータを保持したいと思います。ベストプラクティスは何ですか? ありがとうございました。
PSコードのタイプミスがあれば申し訳ありません。コンパイルせずに書いただけです。