【问题标题】:How do I store api response data (non-persistent) in MVVM?如何在 MVVM 中存储 api 响应数据(非持久性)?
【发布时间】:2019-06-08 05:42:50
【问题描述】:

我正在尝试存储一个 API 响应数据,该数据将被其他网络请求使用,在我的情况下,一个访问令牌将包含在任何后续 API 调用的标头中。我不需要需要永久存储它(这被认为是 UserDefaults、Keychain、CoreData 等。没有必要)因为登录时会提供一个新的。

如何存储令牌以便其他 ViewModel 可以访问它并在进行服务调用时将其作为参数传递?如果我的理解有误,请纠正我。

型号

// Response data object
struct Login: Codable {
    let accessToken: String
    let type: String
}

视图模型

// Call login service upon button tap
let loginOutput = loginTapped
    .filter { username, password in
        username.count >= 4 && password.count >= 4
    }
    .flatMapLatest { username, password in
        PostLoginService.build(User(username: username,
                                    password: password))
            .materialize()
    }
    .share()

let loginSuccess = loginOutput
    .elements() // Return Observable<Login>

视图控制器

// Subscribe to response output
viewModel.output.loginSuccess
    .subscribe(onNext: { [weak self] response in
        // Question:
        // Call a method in ViewModel to store the response?
        // How do I store this response object?
        // Store in Model's Login struct?
    })
    .disposed(by: disposeBag)

【问题讨论】:

    标签: ios swift mvvm model rx-swift


    【解决方案1】:

    您可以再创建一项服务(例如CredentialsService)并将您的令牌存储在BehaviorRelay 的此服务中。 CredentialsService 可能是一个单例,并将作为依赖注入到任何视图模型中。因此,任何视图模型都可以从特殊的CredentialsService 接收令牌。

    【讨论】:

    • 创建一个类来缓存数据是一种常见的做法吗?我知道创建一个类来存储令牌是必要的,因为可能需要刷新令牌的方法,而不仅仅是一个 get set 方法。对于帐户详细信息等情况,该类可能仅包含 get 和 set 方法。
    • 我不知道这是否是一种常见的做法。但它看起来与 SOA 非常相似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多