Je travaille sur une application qui utilise Core Data et NSFetchedResultsController. Un composant majeur de l'application est le filtrage des éléments dans une vue de table indexée basée sur un ensemble de 15 commutateurs prédéfinis qui correspondent à une propriété ou une relation de mes objets gérés. Dans la plupart de mes situations, je suis à la recherche d'un ensemble d'environ 300 à 400 objets, donc la mise en cache/performance n'est pas un problème. Tout est très accrocheur sans mise en cache requise.Problèmes de performance de mise en cache cachée CoreData iPhone
Cependant, il existe une partie de mon application qui effectue une recherche dans tous les objets de ma base de données de CD (~ 15 000 éléments). Ici, j'essaie d'implémenter la mise en cache sur NSFetchedResultsController pour améliorer les performances. La propriété 'cacheString' pour NSFetchedResultsController est simplement la valeur de chaîne du prédicat. Chaque fois que l'utilisateur bascule un commutateur de filtre, je crée un nouveau prédicat, crée un nouveau NSFetchedResultsController et définit le cache sur la valeur de chaîne du nouveau prédicat. Le premier coup pour obtenir tous les éléments (non filtrés) prend ~ 7 secondes, avec les coups suivants prenant moins d'un. Ce qui est étrange, cependant - et voici mon problème - est qu'une fois que je passe à la 'prochaine étape' de la vue tabulaire (je pousse un nouveau contrôleur de vue vers le contrôleur de navigation, en lui passant une référence aux fetchedObjects de NSFetchedResultsController) , la performance diminue considérablement. Cette vue suivante est essentiellement une représentation différente (une vue de défilement horizontal de la pagination) de la liste des tables de la vue précédente avec un élément sur l'écran à la fois. Lorsque je navigue d'un élément à l'autre, l'accès à l'objet précédent ou suivant dans le tableau fetchedObjects verrouille le téléphone pendant environ 5 secondes. La durée de verrouillage augmente plus vous allez dans le tableau fetchedObjects. Si 'i == 0', il n'y a pas de décalage perceptible. Si 'i == 10,000', il faut environ 15 secondes pour accéder à l'objet suivant. Des noisettes! Si je désactive la mise en cache (ou s'il s'agit d'une requête qui n'a pas été mise en cache, elle doit générer de nouveaux résultats), tout sauf la requête de filtre initiale est rapide et rapide avec un décalage nul.
Est-ce que l'activation de la mise en cache cache UNIQUEMENT les informations d'indexation pour une vue tabulaire et non les objets récupérés eux-mêmes?
Je ne suis pas sûr de ce que l'affaire est ici. J'espère que j'ai bien expliqué cela - faites-moi savoir si vous voulez voir du code ou si vous avez besoin d'informations supplémentaires.
Merci! Billy