Сортировка дескриптора на основе упорядоченного отношения "многие"
Описание моей основной модели данных:
- Объекты проекта и проблем
- Проект имеет упорядоченное отношение один-ко-многим к проблемам с именами
- Проблема имеет отношения "один к одному" с проектом с именем parentProject
Вот мой код для получения проблем:
let fetchRequest = NSFetchRequest(entityName: "Issue")
fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let frc = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: dataManager.context,
sectionNameKeyPath: nil,
cacheName: nil)
return arc
Несмотря на то, что у меня есть все проблемы из объекта проекта, я предпочитаю получать проблемы с помощью получаемого контроллера результатов, поэтому они всегда будут обновляться, и мне нравится интеграция с таблицами. Мне также нравится это на экране контроллера навигации, прежде чем проекты будут отображаться с помощью FRC.
Как вы видите в коде, проблемы сортируются по параметру name.
Однако я бы хотел, чтобы они отсортировались по порядку, который я храню в проекте NSMutableOrderedSet.
AFAIK Я не могу использовать NSSortDescriptor со компаратором/селектором, когда он использовался для Core Data.
Вы знаете, как это сделать? Спасибо заранее.
Ответы
Ответ 1
Если вы используете ссылку keypath (в вашем случае parentProject
), она будет сортироваться в соответствии с упорядоченным набором. поэтому вы можете использовать
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)]
Это сначала отсортирует их по проекту, а затем внутри каждой группы проектов будет сортироваться в том же порядке, что и упорядоченное множество в этой связи. Вы можете поместить каждый проект выпуска в другой раздел, используя sectionNameKeyPath
.
Если вы не используете parentProject.name
(или что-то вроде этого - например parentProject.lastUpdated
), тогда они будут ТОЛЬКО сортироваться в соответствии с порядком упорядоченного набора. Другими словами, это будут все первые проблемы, затем все остальные проблемы и т.д. Это, вероятно, не то, что вы хотите.
Ответ 2
Это может быть kluge, но в любом случае. Мне кажется, что ваш первый выбор - это фильтр. показать мне проблемы для этого проекта. Может быть, вы можете выполнить вторую выборку по выбранным проблемам и на этот раз не фильтровать их, а отсортировать их?
Что касается CoreData, у меня есть отсортированная выборка:
func fetchItem() {
print(#function)
let sortDescriptor: NSSortDescriptor!
let defaults: UserDefaults = UserDefaults.standard
if defaults.integer(forKey: "sequenceSwitchValue") == 0 {
sortDescriptor = NSSortDescriptor(key: "itemName", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
} else {
sortDescriptor = NSSortDescriptor(key: "itemName", ascending: false, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
}
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: itemEntity)
request.sortDescriptors = [sortDescriptor]
let predicate: NSPredicate = NSPredicate(format: "itemName == %@", incomingItemName)
request.predicate = predicate
do {
items = try context.fetch(request) as! [ItemEntity]
} catch let error as NSError {
print("Error While Fetching Data From DB: \(error.userInfo)")
}
if items.count > 0 {
let currentItem = items[0]
Возможно, вы сможете использовать значение отношения в предикате.
Ответ 3
Возможно, вы не захотите это услышать, но, к сожалению, вы не можете. NSFetchedResultsController не может быть отсортирован с помощью sortDescriptors на основе упорядоченного отношения "один ко многим". Вы должны указать ошибку с Apple. Вы должны вытолкнуть NSFetchedResultsController и обработать его методом делегирования самостоятельно.
Ответ 4
Самый простой способ сохранить порядок - это добавить свойство для объекта "issue". Что-то называется position
типа Int
. И используйте дескриптор сортировки, который будет сортировать объекты по этому свойству position