Ниже приведена ссылка на скачивание упрощенной версии моего приложения с той же проблемой. Кнопка «Добавить» наверху добавляет новую запись, которая задается с именем = 1, qty = 1 и секцией = 1. Выбор ячейки увеличивает их все до следующего числа. Вы можете видеть, что и имя, и количество обновлений, но раздел никогда не обновляется, пока вы не покинете приложение и не запустите его снова. DropBox Download LinkСобытие обновления раздела, которое не вызывается из связанного объекта в swift
У меня есть следующие настройки отношения в CoreData:
В В моем TableViewController, я создаю мой FetchRequestController (FRC) со следующим кодом:
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Items")
let sortDesc1 = NSSortDescriptor(key: "catalog.sections.section", ascending: true)
let sortDesc2 = NSSortDescriptor(key: "isChecked", ascending: true)
let sortDesc3 = NSSortDescriptor(key: "catalog.name", ascending: true)
fetchRequest.sortDescriptors = [sortDesc1, sortDesc2, sortDesc3]
return fetchRequest
}
func getFCR() -> NSFetchedResultsController {
frc = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: moc, sectionNameKeyPath: "catalog.sections.section" , cacheName: nil)
return frc
}
Итак, как показано, я предварительно формирую запрос на выборку в Entity Item и сортировку по атрибутам как в объектах Catalog, так и в разделах. И, в частности, к моей проблеме, у меня есть секция в моем frc как атрибут раздела в Sections Entity (который связан через Entity Catalog).
Когда я обновляю различные части пункта или каталога, я вижу обновление ячейки таблицы правильно (то есть событие didChangeObject называется)
Но если изменить раздел она никогда не обновляет, если я полностью обратно из таблицу, а затем повторно введите ее. (т. е. событие didChangeSection никогда не вызывается, даже если секция меняется)
Ниже приведен код, который я использую для редактирования ранее существующей записи элемента.
func editItem() {
let item: Items = self.item!
item.qty = Float(itemQty.text!)
item.catalog!.name = Util.trimSpaces(itemName.text!)
item.catalog!.brand = Util.trimSpaces(itemBrand.text!)
item.catalog!.qty = Float(itemQty.text!)
item.catalog!.price = Util.currencyToFloat(itemPrice.text!)
item.catalog!.size = Util.trimSpaces(itemSize.text!)
item.catalog!.image = UIImageJPEGRepresentation(itemImage.image!, 1)
if (self.section != nil) {
item.catalog!.sections = self.section
}
do {
try moc.save()
} catch {
fatalError("Edit Item save failed")
}
if (itemProtocal != nil) {
itemProtocal!.finishedEdittingItem(self, item: self.item!)
}
}
Просто к сведению, когда я добавляю в новой записи в пункт Entity, события didChangeObject и didChangeSection оба правильно называется. Только при их редактировании происходит передача пропускаемого или пропущенного элементаChangeSection.
Просто для завершения, ниже мой код, который я использую для didChangeObject и didChangeSection.
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
switch type {
case NSFetchedResultsChangeType.Update:
self.tableView.reloadSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Automatic)
case NSFetchedResultsChangeType.Delete:
self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Automatic)
case NSFetchedResultsChangeType.Insert:
self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Automatic)
case NSFetchedResultsChangeType.Move:
self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Automatic)
self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case NSFetchedResultsChangeType.Update:
self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)
case NSFetchedResultsChangeType.Delete:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)
case NSFetchedResultsChangeType.Insert:
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
case NSFetchedResultsChangeType.Move:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
Когда я гугле этот вопрос, я обнаружил, что другие были проблемы, подобные этим, и это, кажется, особенность (или ошибка) КОП и как Xcode обрабатывает отношения. В принципе, frc наблюдает только за объектом Entity, а когда объект Section изменяется, он не регистрируется с помощью frc. Люди также предлагали различные хаки, но пока никто из них не работает для меня. Примеры - сделать что-то вроде этого item.catalog.sections = item.catalog.sections
Ни один из примеров не имел ключ раздела как связанный объект, поэтому я не уверен, что именно поэтому они не работают для меня.
Итак, мой вопрос в том, есть ли способ сказать didChangeSection для выполнения и отправить его надлежащий NSFetchedResultsChangeType? Или еще лучше, есть ли какой-то способ «побудить» frc заметить, что происходит в объекте раздела, связанного с объектом объекта через Entity Catalog.
Это сработало отлично! Спасибо за предложение. Я смог реализовать его и в оригинальном приложении. Только другое изменение, которое мне нужно было сделать, это добавить предикат к 'fetchRequest()', поскольку каждый элемент имеет связанный каталог, но не каждый каталог гарантирует наличие связанного элемента. 'let pred = NSPredicate (format:" items! = nil ")' & 'fetchRequest.predicate = pred' Он говорит, что мне нужно подождать 6 часов, прежде чем я смогу наградить награду, но я постараюсь сделать это сегодня вечером. –