2017-06-17 61 views
0

我有以下情况,我在加载应用程序时获取数据,它是一个ChatUserPersonalConversationModel模型的数组,我将此数组作为独立模型存储在Realm中。当我得到一个数组时,如果先前的模型不包含在结果数组中,那么执行以下操作的最佳方法是什么?然后从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

Realm没有任何内置功能来实现您想要的功能。你有什么替代方法是利用斯威夫特的Set类型。

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

接下来,将现有和新型号的阵列变成Set s。 Set有一个初始化程序,可以接受任何对象序列,因此可以将数组和Realm List一起传递给它。

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

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

最后,你可以使用领域delete(_:)方法接受一个序列删除所有过时的模型一次:

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

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

相关问题