4

私は 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コードのタイプミスがあれば申し訳ありません。コンパイルせずに書いただけです。

4

1 に答える 1