Я пытаюсь понять, правильно ли я понимаю предварительную выборку с помощью 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 ответ
Можете ли вы попробовать то же самое, не задавая размер партии?
В справочнике по классам NSFetchRequest в разделе fetchBatchSize есть любопытное примечание:
Если вы установите ненулевой размер пакета, коллекция объектов, возвращаемая при выполнении выборки, разбивается на пакеты. Когда выполняется выборка, оценивается весь запрос и записываются идентификаторы всех совпадающих объектов, но не более, чем данные объектов batchSize будут извлекаться из постоянного хранилища за раз. Массив, возвращаемый при выполнении запроса, будет прокси-объектом, который по запросу выполняет прозрачную ошибку пакетов.
Это как если бы вы установили batchSize, возвращаемые объекты будут повреждены несмотря ни на что.
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].