Извлечение и фильтрация CoreData

У меня вопрос по CoreData.

Допустим, у меня есть 2 объекта CoreData SchoolClass и Child в базе данных CoreData, в которой есть несколько школьных классов, каждый класс с несколькими детьми.

extension SchoolClass {
    …
    @NSManaged  public var children: NSSet?
    …
}

extension Child {
    …
    @NSManaged  public var schoolClass: SchoolClass?
    @NSManaged  public var age: Int?
    …
}

С одной точки моего приложения я должен получить всех дочерних элементов определенного класса, которые соответствуют определенным дополнительным критериям.

Я вижу два способа сделать это:

  1. обрабатывать фильтрацию в объекте SchoolClass. Например, через вычисляемое свойство и вернуть оттуда массив:
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.

Второй оптимизирован, потому что вы выбираете только нужных детей, а в первом вы выбираете все, а затем оставляете только нужный. NSPredicate — это просто способ фильтрации. Можно добавить флаг, чтобы видеть "SQL запрос", фильтрацию лучше делать в запросе

Larme 22.04.2023 13:59

Но первый может быть лучше, если у вас уже есть объект SchoolClass в памяти и, возможно, даже объекты Child. Так что это зависит от многих вещей, таких как структура приложения и то, как вы используете свои данные, сколько дочерних объектов обычно имеет SchoolClass и т. д. и т. д.

Joakim Danielson 22.04.2023 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первый быстрее. Запрос связи выполняется быстрее, поскольку она уже проиндексирована и может уже находиться в памяти. Даже если у вас ОЧЕНЬ большой набор возможных детей и вы хотите, чтобы в наборе было только несколько, отношения все равно будут намного быстрее. У меня лично была аналогичная ситуация с запросом всех сообщений, отправленных пользователем в приложении чата. Несмотря на то, что большинство сообщений не было в конкретном чате, который меня интересовал, постановка в очередь отношений - а не новая выборка - была на порядки быстрее.

Вы можете легко убедиться в этом сами, загрузив тысячу поддельных сущностей, а затем оцените разницу между ошибкой, фильтрацией отношения и выборкой.

Спасибо, Джон, это прояснило для меня ситуацию!

user3680544 23.04.2023 22:05

Другие вопросы по теме