mootymoots
mootymoots

Reputation: 4575

Limit NSFetchedResultsController results, and get more

HI All,

I currently have an NSFetchedResultsController setup to return all rows in a table in my core data database. This then fills up my UITableView. The trouble is this will quickly get out of hand as the rows grow in number.

How can I limit the initial query to say 20 results, then add a button somewhere to "Get More" from where we left off?

Thanks for any guidance as always

Upvotes: 3

Views: 6293

Answers (4)

Elia Palme
Elia Palme

Reputation: 161

To change the limit number on the fly you simply need to:

Access the fetchRequest of your NSFetchedResultsController instance, change the limit, delete the old cache if there is any and perform a new fetch.

Code:

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

Upvotes: 3

Steazy
Steazy

Reputation: 393

fetchBatchSize only affects how many objects are fetched at a time. It will not limit number of objects in-memory concurrently so it is still possible to run out of memory. It is possible to limit the total concurrent objects with a combination of batchSize, fetchLimit, and offset but it requires deleting the cache or storing separate caches per "page", which seems un-ideal to me.

Another more hacky method to get around it is to re-create the NSFetchedResultsController, the results from the old controller will be faulted if possible, and you can start with a clean slate. Really crude, but it avoids deleting the cache.

Upvotes: 1

Peter Pajchl
Peter Pajchl

Reputation: 2709

I believe that instead of setting -setFetchLimit and limiting your NSFetchRequest (for new rows you have to create a new reqeust), set -fetchBatchSize to only control how many rows will be loaded into memory. Say, If you show 10 cells per view, set your batch size to double or so. As you scroll your view, the controller will automatically load new set into memory.

Upvotes: 0

Joshua Nozzi
Joshua Nozzi

Reputation: 61228

This is controlled with NSFetchRequest's -setFetchLimit: and -setFetchOffSet.

If I recall correctly, the drawback with NSFetchedResultsController is that you can't modify the fetch request after you create your NSFetchedResultsController instance. I believe this means you'll have to create a new one (instance w/new fetch request) each time you change the range you want to retrieve/display.

File an enhancement request with Apple at bugreporter.apple.com if you feel this shouldn't be the case.

Upvotes: 3

Related Questions