1

我正在使用 ReactiveKit 和他们的 Bond 扩展,我真的不知道如何做一些感觉很基础的事情。

假设我的应用中有一个用户模型。像这样的东西。

class User: Codable {
  var id: String
  var firstName: String?
  var avatar: String?
}

内容来自远程 API,通过使其向 Codable 确认一切正常且简单。

但是,例如,我想从模型属性到某个 UI 状态的双向绑定;这是不可能的,因为我的所有属性都没有证实BindableProtocol. 或者,如果我想观察模型属性的变化,这当然也不可能。

所以我的问题是:如何在不破坏现有用户模型和行为的情况下将模型属性转换为实际的可观察属性?例如,它仍然需要是 Codable。我是否要创建第二个ObservableUser类,然后在User模型的所有属性中设置 didSet 以将更改写入ObservableUser? 和类似的东西ObservableUser写回User?这似乎很可怕,希望不是重新开始的前进方式。

4

1 回答 1

0

您无需创建另一个对象即可使模型属性可观察。但是实现下面的decoder & encoder方法和编码键肯定会产生开销,enum这在许多情况下也是一种标准做法,

class User: Codable {
    var id: String = ""
    var firstName = Observable<String?>(nil)
    var avatar = Observable<String?>(nil)

    private enum CodingKeys: String, CodingKey {
        case id, firstName, avatar
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = try container.decode(String.self, forKey: .id)
        self.firstName.value = try container.decode(String.self, forKey: .firstName)
        self.avatar.value = try container.decode(String.self, forKey: .avatar)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.id, forKey: .id)
        try container.encode(self.firstName.value, forKey: .firstName)
        try container.encode(self.avatar.value, forKey: .avatar)
    }
}

现在您可以绑定任何UIView元素。


通常,使用响应式方法,ViewModel您可以在其中创建bindable从模型中提供值的属性,以通过保持模型对视图不可见来查看和更新​​模型属性。

于 2019-08-29T21:32:30.610 回答