Как обрабатывать состояние приложения с помощью RxSwift
Я новичок в 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 извините за опечатки в коде, если есть. Я просто написал это без компиляции.
1 ответ
У меня была похожая проблема с сохранением недавнего состояния различных вещей (например, ответов сервера, геолокации и т. Д.), И в конце концов я создал для этого облегченную инфраструктуру на основе Rx, которую я использую с тех пор, и посмотрю, подходит ли она и вашим потребностям. - https://github.com/maxvol/RaspSwift