Секции сортировки NSFetchedResultController по дате перестраиваются

У меня проблема с NSFetchedResultController. У меня есть кнопка, которая сохраняет два значения в Core Data: actualDate и shortDate. Фактическая дата - это переменная NSDate (например, 2014-12-04 08:35:59 +0000), а shortDate - это строка, созданная из actualDate через NSDateFormatter (например, 04 dec).

Ниже этой кнопки будет tableView, который должен отображать все записи, отсортированные по дате в порядке убывания с помощью shortDate в качестве названия раздела для каждого дня (например, 04 dec). Это отлично работает с моим текущим кодом WHILE RUNNING приложения.

Проблема возникает, когда я закрываю приложение и запускаю его снова. Записи по-прежнему находятся в правильном порядке, но имена разделов перегруппированы так, что, например, 30 ноября отображается до 4 декабря. Я действительно не знаю, в чем проблема или как ее решить.

Любая помощь приветствуется!

Здесь мой код для NSFetchedResultController:

// MARK: - Fetched results controller

var fetchedResultsController: NSFetchedResultsController {
 if _fetchedResultsController != nil {

 return _fetchedResultsController!
 }

 let fetchRequest = NSFetchRequest()
 // Edit the entity name as appropriate.
 let entity = NSEntityDescription.entityForName("List", inManagedObjectContext: self.managedObjectContext!)
 fetchRequest.entity = entity

 // Set the batch size to a suitable number.
 fetchRequest.fetchBatchSize = 20

 // Edit the sort key as appropriate.
 let sortDescriptor = NSSortDescriptor(key: "actualDate", ascending: false)
 let sortDescriptor2 = NSSortDescriptor(key: "shortDate", ascending: false)

 fetchRequest.sortDescriptors = [sortDescriptor, sortDescriptor2]


 // Edit the section name key path and cache name if appropriate.
 // nil for section name key path means "no sections".
 let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: "shortDate", cacheName: nil)
 aFetchedResultsController.delegate = self
 _fetchedResultsController = aFetchedResultsController

 var error: NSError? = nil
 if !_fetchedResultsController!.performFetch(&error) {
 // Replace this implementation with code to handle the error appropriately.
 // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
 //println("Unresolved error \(error), \(error.userInfo)")
 abort()
 }

 return _fetchedResultsController!
}
var _fetchedResultsController: NSFetchedResultsController? = nil

func controllerWillChangeContent(controller: NSFetchedResultsController) {
 self.tableView.beginUpdates()
}

func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
 switch type {
 case .Insert:
 self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
 case .Delete:
 self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
 default:
 return
 }
}

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
 switch type {
 case .Insert:
 tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
 case .Delete:
 tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
 /* case .Update:
 self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, atIndexPath: indexPath!)*/
 case .Move:
 tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
 tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
 default:
 return
 }
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
 self.tableView.endUpdates()
}
1 ответ

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой, и каким - то образом мне удалось решить эту проблему, установив cacheName вместо того, чтобы позволить его nil.

Я ответил на этот старый вопрос для всех, кто столкнулся с одной и той же проблемой.

licensed under cc by-sa 3.0 with attribution.