35 votes

(NSFetchedResultsController): impossible de lire le fichier de cache pour mettre à jour les horodatages des informations de magasin

J'ai mis mon projet à niveau vers Xcode 8. Maintenant, je reçois ce journal des erreurs avec la combinaison Xcode 8 et iOS 10.

Définir le cacheName sur nil dans le code ci-dessous semble résoudre le problème.

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

Que dois-je faire pour supprimer ce journal d'erreurs et utiliser le cache dans mon FRC?

27voto

Donnit Points 460

Cette erreur ne doit pas être ignorée, car elle peut causer de l'application crash. Elle est liée à un iOS 10 bug de fichier descripteur de fuites. Il y a des rapports sur openradar et Apple Rapporteur de Bug.

Ce qu'il se passe: si vous chargez une-vue-contrôleur à l'aide de NSFetchedResultsController avec un non-nul cacheName, chaque fois que vous enregistrez la gestion du contexte de l'objet vous permettra d'ouvrir un ou plusieurs descripteurs de fichier pointant vers le sectionInfo fichier de cache de la fetchedResultsController. Cela signifie que si vous enregistrez contexte 255 fois, vous atteignez le nombre maximal de fichiers pouvant être ouverts sur les appareils et pas de nouvelles ressources peut être ouvert, ce qui entraîne l'ouverture subséquente de xib fichiers, images, base de données, etc. à l'échec.

Le problème se produit également pour les applications déjà sur la production (construit avec xcode 7) sur les appareils mis à niveau vers iOS 10.

Une solution temporaire est de désactiver NSFetchedResultsController la mise en cache à néant comme cacheName:

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

Évidemment, dans cette façon nous ne pouvons pas bénéficier de l'avantage de la mise en cache. J'espère que Apple va corriger le bug au plus vite. Je vais tester contre 10,2 bêta 1.

OUVRIR RADAR 28361550

MODIFIER Sur iOS 10.2 bêta 1, le bug ne se produit pas: il a été résolu (pour l'instant).

2voto

curieux Points 153

Première fois que je suis en offrant une réponse ici, mais voilà...

J'ai vécu cette erreur et nous avons trouvé une résolution pour mon cas particulier.

J'ai été en utilisant un NSFetchedResultsController. Je suis alors retourné à ajouter de la Restauration de l'État. Cette erreur a alors commencé à apparaître lors de la restauration. Lorsque j'ai utilisé la barre de navigation pour revenir à la vue précédente contrôleur, les données ont été tous manquantes ou incorrectes.

À la lecture de la NSFetchedResultsController docs, j'ai découvert le suivant:

Important

Un délégué doit mettre en œuvre au moins l'un de la modification de suivi délégué de méthodes pour le suivi des modifications est activé. En fournissant un vide de mise en œuvre de l' controllerDidChangeContent(_:) est suffisante.

J'ai tout simplement mis en place un vide controllerDidChangeContent(_:) comme dirigé. Maintenant, tout fonctionne correctement et le message d'erreur à partir de la question a disparu. Pour être clair, j'ai simplement ajouté le code suivant dans chaque vue-contrôleur avec un récupérés résultats de contrôleur:

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

Espérons que cette aide.

0voto

Saranjith Points 4137

Après avoir porté plus d'attention au message d'erreur ci-dessus, j'ai constaté que votre application créait une grande quantité de descripteurs de fichiers, ouvrait des fichiers dans un dossier de cache et ne les fermait jamais. Il est donc préférable de désactiver la mise en cache NSFetchedResultsController pour le moment.

J'espère que Apple va régler le problème

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X