Подтвердить что ты не робот

(NSFetchedResultsController): не удалось прочитать файл кеша, чтобы обновить временные метки хранилища

Я обновил свой проект до Xcode 8. Теперь я получаю этот журнал ошибок с комбинациями Xcode 8 и iOS 10.

Установка cacheName в nil в приведенном ниже коде кажется исправленной.

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:@"myCache"];

Что мне делать, чтобы избавиться от этого журнала ошибок и использовать кеш в моем FRC?

4b9b3361

Ответ 1

Эта ошибка не должна игнорироваться, поскольку это может привести к сбою приложения. Это связано с ошибкой IOS 10 утечек дескриптора файла. Есть сообщения об openradar и Apple Bug Reporter.

Что произойдет: если вы загрузите контроллер вида с помощью NSFetchedResultsController с не-nil cacheName, каждый раз, когда вы сохраняете контекст управляемого объекта, вы откроете один или несколько файловых дескрипторов, указывающих на файл кеша sectionInfo для fetchedResultsController. Это означает, что если вы сохраняете контекст 255 раз, вы достигнете максимального количества файлов, которые могут быть открыты на устройствах, и новые ресурсы не могут быть открыты, что приведет к сбою любого последующего открытия xib файлов, изображений, базы данных и т.д.

Проблема возникает и для уже запущенных приложений (построенных с помощью xcode 7) на устройствах, обновленных до iOS 10.

Временное решение отключает кеширование NSFetchedResultsController с nil как cacheName:

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:nil];

Очевидно, что таким образом мы не можем использовать кеширование. Надеюсь, Apple исправит ошибку как можно скорее. Я собираюсь протестировать 10.2 beta 1.

ОТКРЫТЫЙ РАДАР 28361550

ИЗМЕНИТЬ На iOS 10.2 beta 1 ошибка не возникает: она была решена (пока).

Ответ 2

Впервые я предлагаю ответ здесь, но здесь идет...

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

Я использовал NSFetchedResultsController. Затем я вернулся, чтобы добавить Государственную реставрацию. Затем эта ошибка начала появляться при восстановлении. Когда я использовал навигационную панель, чтобы вернуться к предыдущему контроллеру представления, все данные были потеряны/неверны.

При чтении документов NSFetchedResultsController я обнаружил следующее:

Внимание!

Делегат должен реализовать хотя бы один из методов делегирования отслеживания изменений, чтобы включить отслеживание изменений. Обеспечить пустую реализацию controllerDidChangeContent(_:) достаточно.

Я просто реализовал пустой controllerDidChangeContent(_:), как указано. Теперь все работает нормально, и сообщение об ошибке от вопроса исчезло. Чтобы быть ясным, я просто добавил следующий код в каждый контроллер представления с помощью выбранного контроллера результатов:

// NSFetchedResultsController change tracking methods
    func controllerDidChangeContent(_ controller: 
NSFetchedResultsController<NSFetchRequestResult>) {
        // empty: see documentation
    }

Надеюсь, что это поможет.

Ответ 3

Уделив больше внимания вышеуказанному сообщению об ошибке, я увидел, что ваше приложение создает большое количество дескрипторов файлов, открывая файлы в папке с кешем и никогда не закрывая или не отпуская их. Поэтому лучше отключить кеширование NSFetchedResultsController.

Надежда Apple решит проблему