Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何删除领域中当前数组中不包含的所有模型_Ios_Arrays_Swift_Realm - Fatal编程技术网

Ios 如何删除领域中当前数组中不包含的所有模型

Ios 如何删除领域中当前数组中不包含的所有模型,ios,arrays,swift,realm,Ios,Arrays,Swift,Realm,我有下面的例子,我在加载应用程序时得到数据,它是一个ChatUserPersonalConversationModel模型的数组,我将这个数组作为一个单独的模型存储在域中。当我得到一个数组时,最好的方法是什么?如果前面的模型不包含在结果数组中,那么我将它从领域中删除 我写了下面的代码,它对我很有用,但我认为它可以做得更好 func updateChatUserPersonalConversationModels(_ chatUserPersonalConversationModels: [Ch

我有下面的例子,我在加载应用程序时得到数据,它是一个
ChatUserPersonalConversationModel
模型的数组,我将这个数组作为一个单独的模型存储在域中。当我得到一个数组时,最好的方法是什么?如果前面的模型不包含在结果数组中,那么我将它从领域中删除

我写了下面的代码,它对我很有用,但我认为它可以做得更好

 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)
            }
        }
    }

Realm没有任何内置功能来实现您想要的功能。另一种方法是利用Swift的
Set
类型

首先,您应该确保为您的模型类定义了equality和hash value属性,并且您可能应该有一个主键(看起来是
id

接下来,将现有和新模型的数组转换为
Set
s
Set
有一个初始值设定项,它接受任何对象序列,因此您可以将数组和Realm
List
s类似地传递给它

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

// itemsToDelete contains models in oldModels that aren't in newModels
let itemsToDelete = oldModels.subtract(newModels)
最后,您可以使用Realm
delete(:)
方法,该方法采用一个序列一次删除所有过时的模型:

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

我希望这有帮助。请注意,这不是万灵药;如果你的数组很大,你可能想考虑这个方法是否使用了太多内存。

这对我来说是有效的,我只需要在模型上重写等号。