Вариант использования прост:
список ToDo
(= NSManagedObject), отображаемый в таблице (NSOutlineView
), где пользователь может щелкнуть заголовок столбца, чтобы отсортировать по выбранному столбцу. Если пользователь сортирует по столбцу date
(= date - первый sortDescriptor), NSFetchedResultsController
генерирует один раздел в месяц (через атрибут monthDate
ToDo
)
Вот это fetchDataModel()
функция:
let fetchRequest = NSFetchRequest<Expense>(entityName: "ToDo")
fetchRequest.predicate = predicate
// Configure the request's entity, and optionally its predicate
let keyPath = #keyPath(ToDo.monthDate)
if self.shouldDisplayGroups() { // = first sort descriptor is 'date'
withSections = true
sortDescriptors.insert(NSSortDescriptor(key: keyPath, ascending: outlineView.sortDescriptors[0].ascending), at: 0)
}
if self.frc != nil {
NSFetchedResultsController<NSFetchRequestResult>.deleteCache(withName: "MyAppCacheID")
}
self.frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: withSections ? keyPath : nil, cacheName: "MyAppCacheID")
self.frc.delegate = self
do {
try self.frc.performFetch()
} catch {
fatalError("Failed to fetch entities: \(error)")
}
Существует проблема, если выполняются следующие условия:
- Текущие первые дескрипторы sortDescriptors находятся в 'date', поэтому секции отображаются
- Пользователь изменяет одну строку (
ToDo
), которая является единственной в своем разделе и не должна изменять раздел после изменения! - Измененный атрибут является частью массива sortDescriptors представления, которое таким образом вызывает изменение ПЕРЕМЕЩЕНИЯ на
NSFetchedResultsControllerDelegate
. Пример: пользователь изменяет описание. Это следует из документации, которая гласит:
О перемещении сообщается, когда измененный атрибут объекта является одним из дескрипторов сортировки, используемых в запросе на выборку.
В этом конкретном c случае, как ни странно, раздел (NSFetchedResultsSectionInfo
) измененного ToDo
изменяется и получает новую ссылку, даже если старые и новые разделы имеют абсолютно одинаковое значение. Поскольку я обрабатываю MOVE путем удаления и добавления, это вызывает проблемы с отображением, поэтому я не могу правильно обновить таблицу (NSOutlineView
). Кроме того, делегат НЕ сообщает об изменении раздела , поэтому я не могу просто справиться с этим путем изменения раздела.
Почему это происходит? И почему, когда в разделе есть только один предмет?