Нарушение отношения CoreData при извлечении основного объекта - PullRequest
2 голосов
/ 27 октября 2009

У меня есть сущность с множеством взаимосвязей. Я представляю определенные свойства объекта в табличном представлении, используя NSFetchedResultsController. Из всех отношений, которые имеет объект, отображаются только 1 из отношений (в настоящее время они имеют ошибку в методе cellforrowat ...). Мне кажется, что это может повлиять на производительность. Можно ли ошибиться в определенных отношениях во время создания запроса Fetch, чтобы CoreData не приходилось извлекать значения при прокрутке таблицы?

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

Во-первых, я бы не предположил, что поведение Базовых данных по умолчанию менее производительно, чем предлагаемый вами подход: без данных для поддержки ваших усилий оптимизация почти наверняка пойдет не так.

Тем не менее, я считаю, -[NSFetchRequest setRelationshipKeyPathsForPrefetching:] выполнит то, что вы хотите.

2 голосов
/ 27 октября 2009

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

NSArray *propertiesToFetch = [[NSArray alloc] initWithObjects:@"title", @"thumbnailImage", nil];
[fetchRequest setPropertiesToFetch:propertiesToFetch];
[propertiesToFetch release];

Однако, если то, что вы описываете, является списком сущностей с одним из отображаемых элементов в строке таблицы, являющимся отношением «один к одному», вы можете использовать -setRelationshipKeyPathsForPrefetching:, как предлагает Барри. Однако в этом случае я бы предложил денормализовать вашу модель данных и перевести это свойство из отношения в непосредственное отношение к исходной сущности. Пересечение отношений намного дороже, чем доступ к свойствам.

1 голос
/ 27 октября 2009

Вы можете вручную ошибиться в объектах, но я не думаю, что вы получите что-нибудь. Независимо от того, совершаете ли вы ошибку во всех объектах одновременно, или вы ошибаетесь в них по одному за раз, при необходимости каждый объект по-прежнему будет поврежден по отдельности.

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

В общем, я бы сказал, не пытайтесь перехитрить Базовые Данные. На этом этапе у него есть годы оптимизации производительности. В то время как на первый взгляд может показаться, что сбой в 100 объектах потребует 100 запросов к базе данных, это не всегда так.

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