2010-08-30 5 views
3

HI Tous,Limite résultats NSFetchedResultsController, et obtenir plus

J'ai actuellement une configuration NSFetchedResultsController pour retourner toutes les lignes d'une table dans ma base de données de base. Cela remplit alors mon UITableView. Le problème est que cela va rapidement devenir incontrôlable au fur et à mesure que les rangées se multiplient.

Comment puis-je limiter la requête initiale à 20 résultats, puis ajouter un bouton quelque part à "Obtenir plus" d'où nous nous sommes arrêtés?

Merci pour toute orientation comme toujours

Répondre

2

Ceci est contrôlé avec -setFetchLimit: et -setFetchOffSet de NSFetchRequest. Si je me souviens bien, l'inconvénient avec NSFetchedResultsController est que vous ne pouvez pas modifier la requête d'extraction après avoir créé votre instance de NSFetchedResultsController. Je crois que cela signifie que vous devrez en créer un nouveau (instance w/new fetch request) chaque fois que vous changerez la gamme que vous voulez récupérer/afficher.

Envoyez une demande d'amélioration à Apple au bugreporter.apple.com si vous pensez que cela ne devrait pas être le cas.

+0

sons désordonnés ... combien de données est sûr de retourner dans un NSFetchedResultsController? Peut-être que je pourrais filtrer à partir de la demande d'extraction en quelque sorte ... Peut-il gérer des milliers de lignes? Juste pour que je puisse avoir une idée ... Imaginez que ma rangée a 4-5 attributs avec de petites quantités de données ... quelques octets. – mootymoots

+0

Je n'ai pas testé quelque chose de spécifique et ces mesures ne signifieraient probablement pas grand chose pour vous car il est douteux que nos modèles se comportent de la même manière. Le mieux est de choisir un nombre (n'importe quel nombre) et de le profiler. –

3

Pour modifier le numéro de limite à la volée, vous devez simplement:

Accédez au fetchRequest de votre instance NSFetchedResultsController, modifiez la limite, supprimez l'ancien cache s'il y a un et effectuer une nouvelle fetch.

code:

[yourFetchedResultsController.fetchRequest setFetchLimit:50]; 
[NSFetchedResultsController deleteCacheWithName:"you cache name"]; 
[yourFetchedResultsController performFetch:nil]; 
+0

Ajoutez un '[self.tableView reloadData]' pour mettre à jour visuellement. – samwize

0

je crois qu'au lieu de mettre en -setFetchLimit et en limitant votre NSFetchRequest (pour les nouvelles lignes, vous devez créer une nouvelle reqeust), mis -fetchBatchSize pour contrôler seulement le nombre les lignes seront chargées en mémoire. Dites, si vous affichez 10 cellules par vue, définissez votre taille de lot pour doubler ou plus. Lorsque vous faites défiler votre vue, le contrôleur chargera automatiquement le nouvel ensemble en mémoire. FetchBatchSize n'affecte que le nombre d'objets récupérés à la fois.

1

Il ne limitera pas le nombre d'objets en mémoire simultanément, il est donc toujours possible de manquer de mémoire. Il est possible de limiter le nombre total d'objets simultanés avec une combinaison de batchSize, fetchLimit et offset, mais cela nécessite de supprimer le cache ou de stocker des caches séparés par page, ce qui ne me semble pas idéal.

Une autre méthode hacky pour contourner le problème est de recréer le NSFetchedResultsController, les résultats de l'ancien contrôleur seront faussés si possible, et vous pouvez commencer avec une table rase. Vraiment brut, mais cela évite de supprimer le cache.

Questions connexes