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

Posted

技术标签:

【中文标题】如何使用 RxSwift 处理应用程序状态【英文标题】:How to handle application state with RxSwift 【发布时间】:2016-08-10 01:02:51 【问题描述】:

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

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

附:抱歉代码中的拼写错误,如果有的话。我只是写了没有编译。

【问题讨论】:

Marin Tomorov 有一篇关于此的好文章 rx-marin.com/post/rxswift-realm-reactive-app-settings 【参考方案1】:

我在保持不同事物的最新状态(如服务器响应、地理位置等)方面遇到了类似的问题,并最终为此制作了一个基于 Rx 的轻量级框架,我一直在使用它,看看它是否适合你的也需要 - https://github.com/maxvol/RaspSwift

【讨论】:

以上是关于如何使用 RxSwift 处理应用程序状态的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxSwift 和 URLSession 处理 401 状态

Alamofire/RxSwift 如何在状态码 401 上自动刷新令牌和重试请求

如何使用 RxSwift 在一个地方捕获来自两个请求的错误

如何在带有 RxSwift 的驱动程序上使用 flatMapLatest

如何在 RxSwift 中使用 tableView 数据源(numberOfRowsInSection)?

如何使用 RxSwift disposeBag 防止 UITableViewCell 中重复的 UIButton 点击