Swift 在核心数据中获取多个objectid?

Swift 在核心数据中获取多个objectid?,swift,core-data,nspredicate,nsfetchrequest,Swift,Core Data,Nspredicate,Nsfetchrequest,在获取核心数据对象之后,我需要稍后重新获取同一组对象。我知道所有ID,但对象可以更改,因此需要通过objectID再次获取,一次全部。如何做到这一点 PS:我不能只使用与第一次获取相同的谓词,因为可以添加新对象,我不需要它们。如果有对象ID数组,可以使用正确的谓词一次获取这些ID的所有对象。大概是 let objectIDs: [NSManagedObjectID] = // Your object IDs from a previous fetch let predicate = NSPred

在获取核心数据对象之后,我需要稍后重新获取同一组对象。我知道所有ID,但对象可以更改,因此需要通过objectID再次获取一次全部。如何做到这一点


PS:我不能只使用与第一次获取相同的谓词,因为可以添加新对象,我不需要它们。

如果有对象ID数组,可以使用正确的谓词一次获取这些ID的所有对象。大概是

let objectIDs: [NSManagedObjectID] = // Your object IDs from a previous fetch
let predicate = NSPredicate(format: "self in %@", objectIDs)
然后在获取中使用该谓词

该谓词表示获取数组中具有对象ID的每个对象。相同类型的较新对象将不包括在内

附加:@vadian提到的“映射”方法类似于这样,其中
MyClass
是托管对象类的名称:

let results: [MyClass] = objectIDs.compactMap { try? context.existingObject(with: $0) as? MyClass }
使用此代码时,您需要使用
existingObject(With:)
而不是
object(With:)
,因为您提到您可能已经删除了一些对象。在这种情况下使用
object(with:)
可能会得到一些虚假的结果,因为该函数总是返回一个托管对象,即使没有一个对象ID


如果您只有几个对象ID,那么这些方法的性能可能非常相似。对于更大的集合,我怀疑
compactMap
会更慢,因为它需要单独询问每个对象的上下文。谓词方法一次请求所有内容,并让SQLite处理查找。不过,我不确定比较结果如何,因此出于某种原因,可能是另一种情况。

我不知道人们为什么投票决定结束投票。问题是明确而具体的。您可以通过objectID从托管对象上下文中获取对象,而无需
fetch
ing对象<代码>映射将objectid ping到对象可能比应用谓词更有效。瓦迪安,我不确定我是否理解你的不使用fetch映射的解决方案。谢谢你,汤姆。我会检查它并接受你的答案,如果有效!你完全明白我需要什么。一个问题。如果删除了这些对象中的任何一个,是否会导致致命错误或只是跳过删除的对象?是否删除了一些对象并不重要。您将获得与数组中的ID匹配的任何对象。如果某些ID不再有效,它们将被忽略。@bodich我添加了在对问题的评论中提到的“映射”方法。