swift CoreData Fetching and Filtering [已关闭]

rjzwgtxy  于 2023-05-05  发布在  Swift
关注(0)|答案(1)|浏览(207)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

12天前关闭
Improve this question
我有一个关于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?
    …
}

从我的应用程序的一个点,我必须获取一个特定类的所有孩子,这些孩子符合某些额外的标准。
我有两种方法:
1.处理SchoolClass对象中的筛选。例如,通过computed属性并从那里返回数组:

extension SchoolClass {
    …
    var filteredChildren: [Child] {
        let set = children as? Set<Child> ?? []
        let filteredSet = set.filter{ $0.age < 10}
        return filteredSet
    }
    …
}

1.一个FetchRequest:

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

哪一个更可取?第一个对我来说似乎更合乎逻辑,因为它只需要检查我感兴趣的特定学校班级的孩子。另一方面,我真的不明白在CoreData fetchRequest的幕后发生了什么神奇的事情。

31moq8wy

31moq8wy1#

第一个更快。查询关系更快,因为它已经被索引,并且可能已经在存储器中。即使你有一个非常大的可能的孩子集,只想要几个在集,关系仍然是快得多。我个人有一个有一个类似的情况与查询所有的消息发送的用户在聊天应用程序.即使大多数消息都不在我感兴趣的特定聊天中,排队的关系-不是一个新的获取-是数量级的速度。
你可以很容易地为自己证明这一点,通过加载一千个假实体,然后计算过滤关系与提取之间的差异。

相关问题