CoreData NSFetchedResultsController всех объектов на основе одноуровневого свойства отношения «один ко многим» - PullRequest
0 голосов
/ 28 августа 2018

У меня есть модель с сущностями категории, статуса и элемента (и по какой-то причине она огромна):

Model Shot

Я хочу сохранить NSFetchedResultsController для всех объектов Category, у которых есть хотя бы один элемент со статусом «открыто» или «куплено». Я так много искал и могу найти тонны CoreData для множества потоков отношений, но, похоже, не могу найти что-то подобное.

Мне нужно предикатное вмешательство - мое в настоящий момент выдает исключение, потому что я пытаюсь использовать отношение ко многим незаконно:

'NSInvalidArgumentException', reason: 'to-many key not allowed here'

Вот мой код в его нынешнем виде (плохой код, плохой!):

lazy var searchHeaderController: NSFetchedResultsController<Category> = {

    let request = Category.createFetchRequest()

    request.predicate = NSPredicate(format: "items.status.name == 'open' || items.status.name == 'purchased'")

    let sort = NSSortDescriptor(key: "sortOrder", ascending: true)
    request.sortDescriptors = [sort]

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: mainContext, sectionNameKeyPath: "sortOrder", cacheName: nil)

    do {
        try fetchedResultsController.performFetch()
    } catch {
        fatalError("Big bummer yo! Error with performFetch in searchHeaderController()  Error:  \(error)")
    }

    return fetchedResultsController

}()

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 23 ноября 2018

Использование ЛЮБОГО ключевого слова в вашем предикате (как упомянуто в комментариях) даст вам рабочий FetchRequest, который получит правильные результаты - изначально.

Однако FetchedResultsController будет только следить за объектами Category и поэтому не заметит никаких изменений в ваших Item объектах.

Решение этой проблемы - просто сохранить дополнительное поле в объекте Category, чтобы помочь FRC. Если какой-либо из предметов открыт или приобретен, тогда установите флаг, что FRC может отслеживать изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...