Подтвердить что ты не робот

Сортировка дескриптора на основе упорядоченного отношения "многие"

Описание моей основной модели данных:

  • Объекты проекта и проблем
  • Проект имеет упорядоченное отношение один-ко-многим к проблемам с именами
  • Проблема имеет отношения "один к одному" с проектом с именем 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.

Вы знаете, как это сделать? Спасибо заранее.

4b9b3361

Ответ 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