Как отсортировать мой NSFetchedResultsController с упорядоченным набором, связанным с сущностью? - PullRequest
0 голосов
/ 15 января 2019

У меня есть модель данных, которая выглядит следующим образом:

enter image description here

Как вы можете видеть, есть отношения многие ко многим. В моем домашнем контроллере просмотра я выбираю все объекты Tag следующим образом:

    let tagFetchRequest =
        NSFetchRequest<NSManagedObject>(entityName: "Tag")
    //3
    tagFetchRequest.predicate = NSPredicate(format: "self.posts.@count != 0")

    //let sort = NSSortDescriptor(key: "posts.first?.timestamp", ascending: false). This line is the issue
    tagFetchRequest.sortDescriptors = [sort]

    fetchedResultsController = NSFetchedResultsController(fetchRequest: tagFetchRequest, managedObjectContext: managedContext, sectionNameKeyPath: nil, cacheName: nil) as? NSFetchedResultsController<Tag>
    fetchedResultsController.delegate = self

    do {
        try fetchedResultsController.performFetch()
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }

Я хочу, чтобы теги отображались так, чтобы тег тех, у кого сообщения были самыми последними, отображался первым. Поскольку сообщения - это упорядоченный набор, я подумаю, возможно, я смогу получить первое сообщение в метке времени упорядоченного набора и отсортировать теги по нему, это сработает. Но не похоже, что язык ключей NSSortDescriptor принимает такие вещи, как «self.posts.first».

Другим вариантом будет - для каждого извлеченного тега выполнить дополнительную выборку своих сообщений, затем отсортировать их программным способом и каким-то образом вернуть значение этой отсортированной самой последней отметки времени и передать его NSFetchedResultsController. Я не знаю, можете ли вы сделать это, хотя - где бы вы сделали эту дополнительную выборку? и можете ли вы передать подобные вещи в NSSortDescriptor.

1 Ответ

0 голосов
/ 23 января 2019

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

Также вы сказали "... для каждого извлеченного тега выполните дополнительную выборку его сообщений". Вы НИКОГДА не должны получать сообщения тега или теги сообщения, но ВСЕГДА используйте связь. Отношения на порядки быстрее.

...