领域 - 对象中的对象列表(Swift 3)

时间:2017-09-04 12:15:19

标签: ios swift swift3 realm

我有一个像这样定义的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的嵌套列表外,它的工作原理非常好。它们不会被添加到领域数据库中。

enter image description here

enter image description here

我认为潜在的问题是我在self.init()中致电self.data之前致电convenience init,但我认为没有办法解决这个问题。你们是否知道如何实现这一点IngredientsModel将正确设置其内容,我会在RecipeModel中列出一些成分?

1 个答案:

答案 0 :(得分:1)

您当前的实施不起作用,因为您没有在ingredients的{​​{1}}方法中调用init的getter / setter,因此RecipeModel实例永远不会在Realm中持久存在。

此外,使用计算属性作为一对多关系(Realm List)是一个非常糟糕的主意,特别是如果您要在此属性的getter中解析结果。每次调用IngredientsModel的getter时,都会创建新的模型对象,而不是仅访问已存储在Realm中的现有模型对象,但您永远不会删除旧的模型对象。如果您实际上将ingredients个实例保存到Realm(如上所述,您目前不做),您会发现您的数据库中存在重复的条目。

你的整个方法看起来真的不是最理想的。您不应该将未解析的IngredientsModel对象存储在模型类中,并使用计算属性来解析它。您应该在初始化模型时对其进行解析,并且根本不应存储未解析的数据。您可以使用ObjectMapper库直接从JSON响应创建Realm对象。