如何使用RxSwift处理应用程序状态

时间:2016-04-18 10:33:01

标签: swift rx-swift application-state

我是RxSwift的新手和RX的整个概念,我想知道如何处理RxSwift从远程服务器获取的全局应用程序状态。

假设我需要获取JSON并将其解析为对象列表以在表视图中显示它,但我还需要以[{id: object}, ...]格式创建地图以使用其他应用程序部分中的数据

例如:应用程序重复从服务器提取人员列表,并且需要人员表视图的数据,以及人员消息显示头像和状态以及相关消息。因此,模型Person和Message组成的视图模型PersonViewModelMessageViewModel需要数据。

拥有这样的结构是正确的方法:

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

这是正确的方式还是存在一些不同的更好的方法?我还想(将来)获取的数据仍然存在。什么是最佳做法?谢谢。

P.S。对不起代码中的拼写错误,如果有的话。我只是在没有编译的情况下编写它。

1 个答案:

答案 0 :(得分:0)

我在处理不同事物的最近状态(例如服务器响应,地理定位等)时遇到了类似的问题,并最终为此创建了一个基于Rx的轻量级框架,我从那时起就开始使用它,看看它是否适合你的需要 - https://github.com/maxvol/RaspSwift