1

Факты:NSManagedObjectContext сливаться из частного контекста, обновить только измененные объекты

  • я использую CoreData.
  • У меня есть родительский объект с дочерними строками, где дети могут превышать 500 объектов.
  • Показывать эти дочерние объекты в UITableViewControllerUITableView.
  • Я установил его для работы с NSFetchedResultsController, что позволяет мне получать обновления, как только что-то меняется. И мне это нужно.
  • Я слияние изменений из частного контекста в контекст главного со следующим кодом:

    @objc func privateContextDidSaveNotification(notification: NSNotification) 
    {    
        let savedContext = notification.object as! NSManagedObjectContext 
    
        if savedContext == self.managedObjectContext 
        { 
         return // This is the Main context 
        } 
    
        if savedContext.persistentStoreCoordinator != self.managedObjectContext.persistentStoreCoordinator 
        { 
         return // This is different DB 
        } 
    
        self.managedObjectContext.performBlockAndWait(
        { 
         self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) 
         self.managedObjectContext.refreshAllObjects() 
        }) 
    } 
    
  • NSFetchedResultsController.delegate устанавливается только на дочерних объектах.

Проблема:

Если даже один дочерний объект для этого родителя объекта изменяется, то func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) вызывается для всех дочерних строк, то есть, это называется> 500 раз, и в основном, приложение зависает.

Что я обнаружил:

  1. Данное обновление уведомлений для всех дочерних объектов вызвано этой линии после слияния: self.managedObjectContext.refreshAllObjects().
  2. Если я удалю эту строку, то NSFetchedResultsController не получает уведомление, что что-то обновляется вообще, но мне это нужно.

Вопросы:

  1. Как я могу сделать, что один конкретный ряд измененного дочернего объекта, то есть - как я могу уведомить NSFetchedResultsController только фактически измененные строки?
  2. Какое типичное решение для уведомления NSFetchedResultsController о объединенных объектах?

Большое спасибо!

Maris

ответ

0

Вы можете теперь использовать NSPersistentContainer для установки вашего стека. Новые контейнеры viewContext и backgroundContext автоматически отправляют и потребляют уведомления и объединяют их с PersistentStoreCordinator.

Таким образом, вам не нужно управлять объединить себя и NSFetchedResultController, что будет установка на viewContext обновит