Ограничьте результаты NSFetchedResultsController и получите больше - PullRequest
3 голосов
/ 31 августа 2010

HI All,

В настоящее время у меня есть настройка NSFetchedResultsController для возврата всех строк в таблице в моей основной базе данных.Это тогда заполняет мой UITableView.Проблема в том, что это быстро выйдет из-под контроля по мере увеличения числа строк.

Как я могу ограничить первоначальный запрос до 20 результатов, а затем добавить кнопку где-нибудь, чтобы "Получить больше" с того места, где мы остановились?

Спасибо за любое руководство, как всегда

Ответы [ 4 ]

3 голосов
/ 23 декабря 2010

Чтобы изменить номер лимита на лету, вам просто необходимо:

Получить доступ к fetchRequest вашего экземпляра NSFetchedResultsController, изменить ограничение, удалить старый кеш, если он есть, и выполнить новую выборку.*

Код:

[yourFetchedResultsController.fetchRequest setFetchLimit:50];
[NSFetchedResultsController deleteCacheWithName:"you cache name"];
[yourFetchedResultsController performFetch:nil];
3 голосов
/ 31 августа 2010

Это управляется с помощью NSFetchRequest -setFetchLimit: и -setFetchOffSet .

Если я правильно помню, недостатком NSFetchedResultsController является то, что вы не можете изменить запрос на выборку после создания своего экземпляра NSFetchedResultsController. Я считаю, что это означает, что вам придется создавать новый (экземпляр с новым запросом выборки) каждый раз, когда вы изменяете диапазон, который хотите получить / отобразить.

Подайте запрос на улучшение в Apple на bugreporter.apple.com , если считаете, что это не так.

1 голос
/ 02 августа 2012

fetchBatchSize влияет только на то, сколько объектов выбирается одновременно. Это не будет ограничивать количество объектов в памяти одновременно, поэтому все еще возможно исчерпать память. Можно ограничить общее количество одновременных объектов комбинацией batchSize, fetchLimit и offset, но это требует удаления кэша или хранения отдельных кэшей на «страницу», что мне кажется неидеальным.

Еще один более хакерский способ обойти это - воссоздать NSFetchedResultsController, результаты от старого контроллера будут по возможности ошибочными, и вы можете начать с чистого листа. Действительно сырой, но он избегает удаления кэша.

0 голосов
/ 13 января 2011

Я полагаю, что вместо установки -setFetchLimit и ограничения вашего NSFetchRequest (для новых строк вы должны создать новый запрос), установите -fetchBatchSize , чтобы контролировать только сколько строк будетбыть загруженным в память.Скажем, если вы показываете 10 ячеек на просмотр, установите размер пакета в два раза или около того.Когда вы прокручиваете изображение, контроллер автоматически загружает новый набор в память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...