【发布时间】:2016-12-17 09:01:01
【问题描述】:
上下文
我们有一些来自JSONSerialization.jsonObject() 的[String: Any] 字典和[[String: Any]] 数组,我们想让它成为Realm Object models 的类实例(下面的例子中假设为PersonModel)。根据 Realm 文档,我们需要设计具有以下属性的模型:
class PersonModel : Object {
dynamic var id = ""
dynamic var name = ""
dynamic var imagePath: String?
let friends = List<PersonModel>()
let movies = List<MovieModel>()
}
我们希望制作实例
- 基于字典创建实例应该是有条件的:即它应该返回一个
Person?,因为有时数据是无效的。 - 基于数组创建列表应仅过滤(或平面映射)有效对象。
- 字典的键名和类的变量名不匹配:即 JSON 可能有一个“用户名”,但对应的类变量是“名称”。这就是我们无法避免手动映射字典解决方案的原因。
问题
- 与Apple's recommendations on how to turn a JSON to an instance 不同,
Realm.create(_:value:update:)不抛出也不返回 nil,这意味着它似乎无法处理无效数据。 - 我们在 Realm 中找不到任何映射实现。事实上,我相信 Realm 要求 according to its doc on json support 事先使用第三方处理 json 数据的有效性。可以在JSONShootout 和"Support custom model mappings" github issue 上找到这些第三方的示例。
问题
假设我们有这个[[String:Any]] 字典数组:
[["userid": "u1",
"username": "bob",
"image": "http://example.com/bob.jpg",
"friendIds": ["u2", "u3"],
"movieIds": ["sw4", "sw5", "sw6", "ro"]],
["userid": "u2",
"username": "max",
"image": "http://example.com/max.jpg",
"friendIds": ["u1", "u3"],
"movieIds": ["sw4", "sw5", "sw6", "sw7"]],
["userid": "u3",
"username": false],
]
期望的结果是:
- “u3”PersonModel 根本没有创建实例,因为它的名称无效。
- 一个名为
"bob"和朋友是List(max)的 PersonModel 实例。 - 一个名为
"max"和朋友是List(bob)的 PersonModel 实例。
但是对于我们来说,我们应该如何使用 RealmSwift 来实现这些条件并不明显。我们看不到如何编写代码来解决不可出错的构造函数Realm.create(_:value:update:)。而且我们看不到第三方 JSON 映射器(如 lyft/mapper 或 JohnSundell/Unbox)如何过滤/将给定的不合适的 [[String:Any]] 转换为与 RealmSwift create() 方法兼容的 [[String:Any]]。
【问题讨论】:
-
嘿 - 你是怎么做到的?我们计划将 Lyft Mapper 与 Realm 结合使用。
-
@AsthaGupta 我相信我让
Realm.create(_:value:update:)创建的实例,然后我检查了它们的有效性并立即删除了不正确的实例。
标签: ios json swift initialization realm