我有一个关于 CoreData 的问题。
假设我在 CoreData 数据库中有 2 个 CoreData 实体 SchoolClass 和 Child,其中有多个学校班级,每个班级有多个孩子。
extension SchoolClass {
…
@NSManaged public var children: NSSet?
…
}
extension Child {
…
@NSManaged public var schoolClass: SchoolClass?
@NSManaged public var age: Int?
…
}
从我的应用程序的一个点,我必须获取特定班级的所有孩子,这些孩子符合某些额外的标准。
我看到有两种方法可以做到这一点:
extension SchoolClass {
…
var filteredChildren: [Child] {
let set = children as? Set<Child> ?? []
let filteredSet = set.filter{ $0.age < 10}
return filteredSet
}
…
}
let fetchRequest: NSFetchRequest<Child> = Child.fetchRequest()
let predicate1 = NSPredicate(format: „schoolClass === %@„ targetSchoolclass }
let predicate2 = NSPredicate(format: „age < 10“}
let predicate = NSCompoundPredicate(type: .and, subpredicate: [predicate1, predicate2])
fetchRequest.predicate = predicate
if let fetchedChildren = try? context.fetch(fetchRequest) {
…
}
哪个更可取?第一个对我来说似乎更合乎逻辑,因为它只需要检查我感兴趣的特定学校班级的孩子。另一方面,我真的不明白,核心数据获取请求的幕后发生了什么魔法。
第一个更快。查询关系更快,因为它已经被索引,并且可能已经在内存中。即使你有一个非常大的可能的子集并且只想要其中的几个,这种关系仍然要快得多。我个人在查询聊天应用程序中用户发送的所有消息时遇到了类似的情况。尽管大多数消息在我感兴趣的特定聊天中都不存在,但将关系排队——不是新的获取——要快几个数量级。
您可以通过加载一千个假实体轻松地为自己证明这一点,然后计算错误过滤关系与获取错误之间的差异。