web-dev-qa-db-fra.com

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

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

Définir le cacheName sur nil dans le code ci-dessous semble le corriger.

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

Que dois-je faire pour me débarrasser de ce journal d'erreurs et utiliser le cache dans mon FRC?

35
iCanCode

Cette erreur ne doit pas être ignorée car elle peut entraîner le blocage de l'application. Il est lié à un bug iOS 10 de fuites de descripteurs de fichiers. Il existe des rapports sur openradar et Apple Bug Reporter.

Que se passe-t-il: si vous chargez un contrôleur de vue à l'aide de NSFetchedResultsController avec un cacheName non nul, chaque fois que vous enregistrez le contexte d'objet géré, vous ouvrirez un ou plusieurs descripteurs de fichier pointant vers le fichier de cache sectionInfo du fetchedResultsController. Cela signifie que si vous enregistrez le contexte 255 fois, vous atteindrez le nombre maximal de fichiers pouvant être ouverts sur les appareils et aucune nouvelle ressource ne pourra être ouverte, ce qui entraînera l'échec de toute ouverture ultérieure de fichiers xib, d'images, de base de données, etc.

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

Une solution temporaire désactive la mise en cache NSFetchedResultsController avec nil comme cacheName:

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

Évidemment, de cette façon, nous ne pouvons pas tirer parti de la mise en cache. J'espère que Apple corrigera le bogue dès que possible. Je vais tester contre 10.2 beta 1.

RADAR OUVERT 2836155

[~ # ~] modifier [~ # ~] Sur iOS 10.2 beta 1 le bug ne se produit pas: il a été résolu (pour l'instant).

26
Donnit

La première fois que je propose une réponse ici, mais voici ...

J'ai rencontré cette erreur et j'ai trouvé une résolution pour mon cas particulier.

J'utilisais un NSFetchedResultsController. Je suis ensuite retourné pour ajouter State Restoration. Cette erreur a alors commencé à apparaître lors de la restauration. Lorsque j'ai utilisé la barre de navigation pour revenir à un contrôleur de vue précédent, les données étaient toutes manquantes/incorrectes.

En lisant les documents NSFetchedResultsController, j'ai découvert ce qui suit:

Important

Un délégué doit implémenter au moins une des méthodes de délégué de suivi des modifications pour que le suivi des modifications soit activé. Fournir une implémentation vide de controllerDidChangeContent(_:) est suffisant.

J'ai simplement implémenté une controllerDidChangeContent(_:) vide comme indiqué. Maintenant, tout fonctionne bien et le message d'erreur de la question a disparu. Pour être clair, j'ai simplement ajouté le code suivant dans chaque contrôleur de vue avec un contrôleur de résultats récupéré:

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

J'espère que cela t'aides.

2
curieux

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

Hope Apple résoudra le problème

0
Saranjith