ios - Realm - 对象中的对象列表(Swift 3)

标签 ios swift swift3 realm

我有一个这样定义的模型类:

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 的嵌套列表外,它工作得很好。它们不会被添加到 Realm 数据库中。

enter image description here

enter image description here

我认为潜在的问题是,我在 convenience init 中调用 self.data 之前调用了 self.init() ,但我看不出有什么办法可以解决这个问题。你们知道我如何实现 IngredientsModel 正确设置其内容并且我在 RecipeModel 中有成分列表吗?

最佳答案

您当前的实现不起作用,因为您没有在 RecipeModelinit 方法中调用 ingredients 的 getter/setter 和因此 IngredientsModel 实例永远不会保留在 Realm 中。

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

您的整个方法似乎并不理想。您不应该将未解析的 data 对象存储在您的模型类中并使用计算属性来解析它。您应该在初始化模型时解析它,根本不应该存储未解析的数据。您可以使用 ObjectMapper用于直接从 JSON 响应创建 Realm 对象的库。

关于ios - Realm - 对象中的对象列表(Swift 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036843/

相关文章:

ios - 两次显示带导航栏的模态,无法获取第一个模态

ios - 停止 AVPlayer 在 tableviewcell 中播放

ios - Swift 中的 MKTileoverlay 问题

ios - 在 Swift 3.1 中调配 CocoaTouch 类

ios - 为什么 view.layer.renderInContext() 对于相同大小的屏幕截图需要更多的临时内存

ios - Xcode 6 中的设备截图位置

android - iOS & 安卓 : Quickest way to get rid of Admob Banner ad without updating the whole app?

swift - 有没有办法重现 iOS 键盘中麦克风按钮的麦克风 Action ?

ios - 下载并使用大量头像

android - 类似android的iOS应用程序未运行或关闭状态时如何处理数据类型fcm通知?