Я пытаюсь понять, правильно ли я понимаю предварительную выборку с помощью Core Data. Я выполняю запрос на выборку с batchSize, равным 20 для объекта Message, с однозначным отношением со свойством MBDate. Я предварительно выбираю это свойство:

[fetchRequest setRelationshipKeyPathsForPrefetching:
           [NSArray arrayWithObjects:@"date", nil]];

Команда предварительной выборки выполняется, как показано в следующих выходных данных:

CoreData: annotation: Prefetching with key 'date'.  Got 9 rows.
CoreData: annotation: total fetch execution time: 0.0094s for 20 rows

Однако только в первой партии, если я это сделаю

if(message.date.isFault) NSLog(@"isFault");,

Он всегда выводит isFault, даже если я его предварительно загрузил! И если я пытаюсь получить доступ к любому из свойств объекта MBDate, срабатывает запрос сбоя:

CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDATE, t0.ZDATESTRING FROM ZMBDATE t0 WHERE  t0.Z_PK = ? 
CoreData: annotation: sql connection fetch time: 0.0008s
CoreData: annotation: total fetch execution time: 0.0014s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x85d22b0 <x-coredata://736D04C4-7DB3-40B7-B208-79B5DFD68260/MBDate/p61>

Почему не выполняется предварительная выборка? Почему мои объекты все еще неисправны? Я знаю, что сложно дать однозначный ответ, но любые советы или идеи были бы замечательными!

1
Snowman 24 Июн 2012 в 18:50

1 ответ

Лучший ответ

Можете ли вы попробовать то же самое, не задавая размер партии?

В справочнике по классам NSFetchRequest в разделе fetchBatchSize есть любопытное примечание:

Если вы установите ненулевой размер пакета, коллекция объектов, возвращаемая при выполнении выборки, разбивается на пакеты. Когда выполняется выборка, оценивается весь запрос и записываются идентификаторы всех совпадающих объектов, но не более, чем данные объектов batchSize будут извлекаться из постоянного хранилища за раз. Массив, возвращаемый при выполнении запроса, будет прокси-объектом, который по запросу выполняет прозрачную ошибку пакетов.

Это как если бы вы установили batchSize, возвращаемые объекты будут повреждены несмотря ни на что.

1
svena 25 Июн 2012 в 10:44
Но посмотрите, что это было ошибкой со скоростью, намного меньшей, чем мой размер пакета, как и каждые 5 объектов, на которых он был неисправен, когда мой размер пакета был 100. В итоге я запустил отдельную выборку, чтобы получить мои даты и поместить их в массив, который будет автоматически "загружать" их для меня, не делая больше ничего
 – 
Snowman
25 Июн 2012 в 15:50