Основные данные NSFetchedResultsController не обновляется после batchUpadate на устройстве, но нормально на симуляторе

У меня есть NSFetchedResultsController который управляет моим источником данных UITableView .

Я пытаюсь изменить свойство NSManagedObject под названием amountToCompute используя NSBatchUpdateRequest . Поэтому я создаю пакетное обновление:

 let batchUpdate = NSBatchUpdateRequest(entityName: "MyEntity") batchUpdate.propertiesToUpdate = ["amountToCompute" : newAmount] batchUpdate.resultType = .UpdatedObjectIDsResultType 

Я выполняю его:

 var batchError: NSError? let batchResult = managedContext.executeRequest(batchUpdate, error: &batchError) as! NSBatchUpdateResult? 

И чтобы обновить текущий управляемый контекст, я обновляю каждый управляемый объект в управляемом контенте и выполняю новый fetchedResultsController :

 if let result = batchResult { let objectIDs = result.result as! [NSManagedObjectID] for objectID in objectIDs { let managedObject: NSManagedObject = managedContext.objectWithID(objectID) if !managedObject.fault { managedContext.refreshObject(managedObject, mergeChanges: true) } if !fetchedResultsController.performFetch(&error) { println("error: + \(error?.localizedDescription), \(error!.userInfo)") } } } 

Я NSFetchedResultsControllerDelegate некоторые методы делегата NSFetchedResultsControllerDelegate для управления изменениями в результатах, отправленных NSFetchedResultsController :

 func controllerWillChangeContent(controller: NSFetchedResultsController) { tableView.beginUpdates() } func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { switch type { ... case .Update: reloadRowsAtIndexPaths([indexPath!], animation: reloadRowsWithAnimation) let myManagedObject = anObject as! MyManagedObject println("update : \(myManagedObject.amountToCompute)") ... } } func controllerDidChangeContent(controller: NSFetchedResultsController) { tableView.endUpdates() } 

Я запускаю приложение на своем симуляторе 8.4 iOS, и все идет хорошо. println("update : \(myManagedObject.amountToCompute)") печатает новое значение.

Я запускаю приложение на своем iPhone 6 8.4.1, и значение не обновляется, println("update : \(myManagedObject.amountToCompute)") печатает старое значение. Новое значение сохраняется правильно, но изменения не отображаются в моем представлении таблицы, пока они работают на симуляторе.

Что не так? Почему это может быть иначе, будь я на симуляторе или на моем устройстве. Версии не совсем то же самое, но я сомневаюсь, что Apple коснулась архитектуры Core Data в своем последнем обновлении.

Это необычная, но известная проблема, с которой я столкнулся с собой и провел пару дней, вытаскивая свои волосы, пока не нашел этот пост в блоге, который работал на меня.

https://stevenpsmith.wordpress.com/2011/08/12/nsfetchedresultscontroller-and-core-data-managed-object-updates/

Он сводился к добавлению этой единственной строки кода, которая установила нулевой интервал непрерывности:

[context setStalenessInterval: 0];

Если я правильно прочитаю ваш пост, у вас будет такая же проблема. 🙂

  • Запуск экранов может не устанавливать пользовательские имена классов
  • Распространение Swift App In-house
  • Установите MPNowPlayingInfoCenter с другим фоновым звуком
  • UILabels в пользовательском UITableViewCell никогда не инициализируется
  • Swift - анимация заливки цвета
  • Импорт XCTest в динамическую структуру
  • В UILabel несколько строк с несколькими цветами для каждой строки?
  • Swift NSUserDefaults NSArray с использованием objectForKey
  • Как добавить подкласс в список <суперкласс> в Realm Swift
  • Пользовательский массив объектов NSKeyedArchiver
  • Swift: просмотр прокрутки вверх, когда на клавиатуре отображается
  • Давайте будем гением компьютера.