У меня есть модель данных, которая выглядит следующим образом:
Как вы можете видеть, есть отношения многие ко многим. В моем домашнем контроллере просмотра я выбираю все объекты 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.