Выборка большого количества объектов с Core Data, каковы последствия?

#iphone #objective-c #cocoa-touch #core-data #nsfetchrequest

#iPhone #objective-c #cocoa-touch #core-data #nsfetchrequest

Вопрос:

Не повредит ли выполнение, NSFetchRequest которое извлекает много объектов, возможно, около 3-5 Тыс.? Я понимаю, что Core Data использует нечто, называемое «сбойкой», которое гарантирует, что объекты не находятся в памяти до тех пор, пока они действительно не понадобятся. Итак, если я извлекаю 5 тысяч объектов в NSArray, это означает, что объекты на самом деле являются просто заполнителями, пока я фактически не получу доступ к их свойствам? Это плохая практика?

Комментарии:

1. Core Data высоко оптимизирован; я не думаю, что именно здесь у вас возникнут проблемы. Вопрос, который вы всегда должны задавать, заключается в том, зачем вам нужно 5k объектов в памяти одновременно? Может ли пользователь взаимодействовать с таким количеством? Если вам нужно обработать их все, можете ли вы упорядочить? И т.д.

2. Вовсе нет; пользователь будет взаимодействовать с ними только по одному за раз. Проблема в том, что мне нужно их перетасовать. Насколько я знаю, нет способа выполнить «запрос на случайную выборку», поэтому я подумал, что просто получу их все, а затем произведу собственную перетасовку.

3. Как вы их извлекаете — есть ли индекс или что-нибудь еще, имеющее известный диапазон? Вы могли бы выполнить рандомизацию в этом диапазоне, чтобы сгенерировать случайную выборку.

4. Да, я мог бы использовать дескриптор сортировки и каждый раз устанавливать случайное значение fetchOffset, но мне также нужна гарантия, что ни с одним объектом не взаимодействуют дважды. Я мог бы отслеживать все fetchOffsets, которые я использовал, но в конечном итоге это тоже превратится в массив из 3-5 тыс. объектов.

5. Если fetchOffset имеет значение int или long, то 5k не имеет большого значения. В противном случае вы могли бы обновить строку core data с помощью «hasInteracted» = TRUE, и если вы получите значение TRUE, извлеките следующую случайную строку. Или вы могли бы удалить каждый из них после его получения или переместить в другую таблицу, в зависимости от того, сможете ли вы легко восстановить свои данные, когда вам придется начинать все сначала.

Ответ №1:

Core Data высоко оптимизирован и должен быть способен обрабатывать 3-5 тыс. объектов. Вам нужно эмпирически определить, как это влияет на потребление памяти вашим приложением во время выполнения.