ios - Realm :防止对对象进行不必要的更新

标签 ios swift realm

我有一个设置,我从服务器获取一些 json 数据来填充表格。有可能是数据变了,所以我每次都把数据全部取过来。我将该数据映射到一个 Realm 对象并将其保存到数据库中。主要 ID 用于防止重复。

我使用 Realm 通知来保持 TableView / Collection View 与数据源同步。当服务器请求完成时,对象会更新或添加到数据库中,并且 View 会自动重新加载。

问题是所有单元格都会重新加载,因为数据库中的所有对象都会更新,即使它们实际上没有任何不同,因为我只是盲目地使用 realm.add(object, update:真)是否有一种好方法可以防止更新实际上并未更改的对象,从而避免不必要地重新加载单元格?

我尝试的解决方案是为 Realm 的对象类编写一个扩展,包括一个函数,该函数检查是否存在具有相同主 ID 的任何对象,比较它们,如果它们不匹配则添加/更新对象。但是,我有很多对象类,在不知道对象类的情况下,我找不到从对象本身获取对象类型的方法。

// All subclasses of ServerObject have id as their primaryKey
let object = database.objectForPrimaryKey(type:???, key: self.id)

我不想将相同的代码块复制到我的每个类中,因为那是在自找麻烦,所以我需要一些可以在协议(protocol)或扩展中使用的东西,或者只是一种完全不同的方式着手处理服务器的响应。

最佳答案

听起来您想要的是:

extension Object {
    public func hasChanges(realm: Realm) -> Bool {
        guard let obj = realm.objectForPrimaryKey(self.dynamicType, key: self["id"])
            else { return true }

        for property in obj.objectSchema.properties {
            let oldValue = obj[property.name]
            let newValue = self[property.name]

            if let newValue = newValue {
                if oldValue == nil || !newValue.isEqual(oldValue) {
                    return true
                }
            } else if oldValue != nil {
                return true
            }
        }
        return false
    }
}

这将用作:

let obj = MyObjectType()
obj.id = ...;
obj.field = ...;
if obj.hasChanges(realm) {
    realm.add(obj, update: true)
}

关于ios - Realm :防止对对象进行不必要的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38780319/

相关文章:

java - Realm 异步任务

ios - IAP autoRenewable 订阅,SKPaymentQueue 更新交易功能没有响应

ios - 弹出框不显示内容

ios - "Ambiguous Reference To"Swift 3 中的错误

android - 成员数组包含字符串的 Realm 查询

node.js - 如何在 Node Realm 模式中编写 RealmList

ios - 错误 ITMS-90046 : "Invalid Code Signing Entitlements." using custom applinks

ios - 单个 cartfile 为多个目标指定和安装依赖项

ios - 不相互 react 的不同触摸 objective-c

arrays - 当所有类型都正确定义时,为什么 Swift 的 reduce 函数会抛出 'Type of expression ambigious without more context' 错误?