что отличается в CoreData - PullRequest
       1

что отличается в CoreData

2 голосов
/ 21 декабря 2011

Я работаю с Coredata Framework. И теперь у меня есть проблема с этим:
У меня есть отношение [1:n] между Order и OrderDetail Object. В первом просмотре таблицы я использую NSFetchedResultsController, чтобы получить список Order. Моя проблема как считать Ordertail каждого Order.

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

У меня есть Order объект. Назовите его parent_Object.

Какой хороший способ считать OrderDetail:

  1. использовать NSFetchRequest с предикатом "Order == %@', parent_Object. Затем я считаю массив результатов выборки.
  2. использовать свойство: parent_Object.OrderDetails.count

В чем разница и каким образом сэкономить время выполнения.
Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

Если вы посмотрите, что делает яблоко, когда спросите

    [paretnt_Object.orderdetails allObjects];

Вы обнаружите, что они делают простой запрос FetchRequest.

Я думаю, у вас есть 2 варианта

  1. use -

    - (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error:(NSError **)error
    

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

  2. В последнем WWDC есть лекция по CoreData.одна из вещей, которую я узнал из лекции, заключается в том, что вы должны попытаться построить свои данные так, как вы собираетесь использовать их позже.Если вы знаете, что эти запросы на выборку вам понадобятся очень часто, вы можете сохранить OrderDetail count как свойство внутри Order и обновлять счетчик каждый раз, когда он изменяется.таким образом вы будете делать это один раз каждый раз, когда добавляете или вычитаете OrderDetail, и это будет намного быстрее, если вы будете делать это одновременно со многими сущностями Order.

УДАЧИ

0 голосов
/ 21 декабря 2011

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

  1. Создание предиката и использование его для извлечения всех Order объектов в массиве.Затем вы вызываете счетчик, чтобы получить общее число OrderDetails для Order.

  2. У вас уже есть nsset управляемых объектов и количество вызовов для него.

Итак, логически второй способ быстрее, так как вы ничего не делаете.Но это действительно не должно иметь значения для небольших проектов.Если у вас есть большое количество объектов, и вы просто хотите получить результаты, вы всегда можете вызвать setFetchLimit: в запросе, прежде чем его получить.

...