如何删除Realm中当前数组中未包含的所有模型

时间:2017-06-17 04:44:12

标签: ios arrays swift realm

我有以下情况,我在加载应用程序时获取数据,它是ChatUserPersonalConversationModel模型的数组,我将此数组作为单独的模型存储在Realm中。当我得到一个数组并且如果前面的模型没有包含在结果数组中时,执行以下操作的最佳方法是什么,那么我将它从Realm中删除。

我写了下面的代码,它适用于我,但我认为它可以做得更好。

 func updateChatUserPersonalConversationModels(_ chatUserPersonalConversationModels: [ChatUserPersonalConversationModel]) {
        DispatchQueue.main.async {
            do {
                let realm = try Realm()
                let existChatUserPersonalConversationModels = realm.objects(ChatUserPersonalConversationModel.self)

                for existChatUserPersonalConversationModel in existChatUserPersonalConversationModels {
                    if !chatUserPersonalConversationModels.contains(where: { (newChatUserPersonalConversationModel) -> Bool in
                        return newChatUserPersonalConversationModel.id == existChatUserPersonalConversationModel.id
                    }) {
                        try realm.write {
                            realm.delete(existChatUserPersonalConversationModel)
                        }
                    }
                }

                try realm.write {
                    realm.add(chatUserPersonalConversationModels, update: true)
                }
            } catch {
                debugPrint(error.localizedDescription)
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

Realm没有任何内置功能来实现您的目标。替代你拥有的是使用Swift的Set类型。

首先,您应该确保为您的模型类定义了相等性和哈希值属性,并且您应该有一个主键(似乎是id)。

接下来,将现有模型和新模型的数组转换为Set s。 Set有一个初始化程序,可以接受任何对象序列,因此您可以将数组和Realm List一样传递到它中。

接下来,使用subtract(_:)上的Set方法获取一个只包含您要删除的元素的新集:

// itemsToDelete contains models in oldModels that aren't in newModels
let itemsToDelete = oldModels.subtract(newModels)

最后,您可以使用Realm delete(_:)方法,该方法采用序列一次删除所有过时的模型:

try! realm.write {
    realm.delete(itemsToDelete)
}

我希望这会有所帮助。请注意,这不是灵丹妙药;如果您的阵列很大,您可能需要考虑这种方法是否使用了太多内存。