ios - irradiancia - (NSFetchedResultsController): no se pudo leer el archivo de caché para actualizar las marcas de tiempo de la información de la tienda
no puede escribirse el archivo de caché de irradiancia (3)
Actualicé mi proyecto a Xcode 8. Ahora, obtengo este registro de errores con la combinación de Xcode 8 y iOS 10.
Establecer el cacheName en cero en el siguiente código parece arreglarlo.
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:@"myCache"];
¿Qué debo hacer para deshacerme de este registro de errores y usar el caché en mi FRC?
Después de prestar más atención al mensaje de error anterior, pude ver que su aplicación estaba creando una gran cantidad de descriptores de archivo, abriendo archivos en una carpeta de caché y nunca cerrándolos ni soltándolos. Por lo tanto, es mejor desactivar el almacenamiento en caché NSFetchedResultsController
por ahora.
Hope Apple solucionará el problema
Este error no se debe ignorar porque puede causar el bloqueo de la aplicación. Está relacionado con un error de iOS 10 en las filtraciones del descriptor de archivos. Hay informes sobre openradar y Apple Bug Reporter.
Qué sucede: si carga un controlador de vista utilizando NSFetchedResultsController con un cacheName no nulo, cada vez que guarde el contexto del objeto gestionado, abrirá uno o más descriptores de archivo que apuntan a la sección Archivo de caché de información de fetchedResultsController. Esto significa que si guarda el contexto 255 veces, alcanzará la cantidad máxima de archivos que se pueden abrir en los dispositivos y no se podrán abrir nuevos recursos, lo que hará que falle cualquier apertura posterior de archivos xib, imágenes, bases de datos, etc.
El problema también ocurre con las aplicaciones que ya están en producción (compiladas con xcode 7) en dispositivos actualizados a iOS 10.
Una solución temporal es deshabilitar el almacenamiento en caché NSFetchedResultsController con nil como cacheName:
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:nil];
Obviamente de esta manera no podemos aprovechar el almacenamiento en caché. Espero que Apple solucione el error lo antes posible. Voy a probar contra 10.2 beta 1.
EDITAR En iOS 10.2 beta 1 el error no ocurre: se ha resuelto (por ahora).
La primera vez que ofrezco una respuesta aquí, pero aquí va ...
Experimenté este error y encontré una resolución para mi caso particular.
Estaba usando NSFetchedResultsController
. Luego volví para agregar Restauración del Estado. Este error comenzó a aparecer luego de la restauración. Cuando utilicé la barra de navegación para volver a un controlador de vista anterior, todos los datos faltaban o eran incorrectos.
Al leer los documentos NSFetchedResultsController
, descubrí lo siguiente:
Importante
Un delegado debe implementar al menos uno de los métodos de delegado de seguimiento de cambios para habilitar el seguimiento de cambios. Proporcionar una implementación vacía de
controllerDidChangeContent(_:)
es suficiente.
Simplemente implementé un controllerDidChangeContent(_:)
como se indica. Ahora, todo funciona bien y el mensaje de error de la pregunta ya no está. Para ser claros, simplemente agregué el siguiente código en cada controlador de vista con un controlador de resultados obtenido:
// NSFetchedResultsController change tracking methods
func controllerDidChangeContent(_ controller:
NSFetchedResultsController<NSFetchRequestResult>) {
// empty: see documentation
}
Espero que esto ayude.