我有一个像这样定义的Models类:
class BaseModel: Object {
var data: JSON = JSON.null
convenience init(_ data: JSON) {
self.init()
self.data = data
}
override static func ignoredProperties() -> [String] {
return ["data"]
}
}
class RecipeModel: BaseModel {
dynamic var title: String {
get { return data["fields"]["title"].stringValue }
set { self.title = newValue }
}
... more vars ...
var ingredients: List<IngredientsModel> {
get {
let ingredients = List<IngredientsModel>()
for item in data["fields"]["ingredients"] {
ingredients.append(IngredientsModel(item.1))
}
return ingredients
}
set { self.ingredients = newValue }
}
}
class IngredientsModel: BaseModel {
dynamic var text: String {
get { return data["text"].stringValue }
set { self.text = newValue }
}
... more vars ...
}
我想用这样的东西:
Api.shared.fetchAllEntries().call(onSuccess: {response in
print(response.json)
let realm = try! Realm()
try! realm.write {
realm.deleteAll()
}
for item in response.json["items"].arrayValue {
let recipe = RecipeModel(item)
try! realm.write {
realm.add(recipe)
}
}
}, onError: {
print("error")
})
所以基本上我的想法是将整个JSON传递给初始的RecipeModel
类,它应该解析它并在Realm数据库中创建我需要的对象。除了IngredientsModel
的嵌套列表外,它的工作原理非常好。它们不会被添加到领域数据库中。
我认为潜在的问题是我在self.init()
中致电self.data
之前致电convenience init
,但我认为没有办法解决这个问题。你们是否知道如何实现这一点IngredientsModel
将正确设置其内容,我会在RecipeModel
中列出一些成分?
答案 0 :(得分:1)
您当前的实施不起作用,因为您没有在ingredients
的{{1}}方法中调用init
的getter / setter,因此RecipeModel
实例永远不会在Realm中持久存在。
此外,使用计算属性作为一对多关系(Realm List)是一个非常糟糕的主意,特别是如果您要在此属性的getter中解析结果。每次调用IngredientsModel
的getter时,都会创建新的模型对象,而不是仅访问已存储在Realm中的现有模型对象,但您永远不会删除旧的模型对象。如果您实际上将ingredients
个实例保存到Realm(如上所述,您目前不做),您会发现您的数据库中存在重复的条目。
你的整个方法看起来真的不是最理想的。您不应该将未解析的IngredientsModel
对象存储在模型类中,并使用计算属性来解析它。您应该在初始化模型时对其进行解析,并且根本不应存储未解析的数据。您可以使用ObjectMapper库直接从JSON响应创建Realm对象。