我有以下情况,我在加载应用程序时获取数据,它是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)
}
}
}
答案 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)
}
我希望这会有所帮助。请注意,这不是灵丹妙药;如果您的阵列很大,您可能需要考虑这种方法是否使用了太多内存。