2013-03-30 5 views
0

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

Пользователь моего приложения регистрирует объекты в течение месяца - у них разные атрибуты, меня интересует только имя NSString *category.

Object.h 
NSString *category 
... 

В течение месяца он может регистрировать от 10 до 1000 таких объектов, хранящихся в coredata. Пользователь может определить собственные категории - и мне нужно выяснить, какие категории были использованы в течение этого месяца (для создания файла экспорта).

В настоящее время я делаю следующее (псевдокод)

NSArray *allObjects = [_dataHandler fetchAllObjectsForMonth:monthToExport]; 
NSMutableSet *allCategoryNamesSet = [[NSMutableSet alloc]init]; 
for(Object *obj in allObjects){ 
    [allCategoryNamesSet addObject:obj.category]; 
} 

Тогда как это работает, он получает очень медленно, с большим количеством объектов, как выборка требует времени и итерации, а также, конечно.

Я пытался что-то подобное, а также:

NSArray *categories = [allObjects valueForKeyPath:@"category"]; 
NSSet *allCategorieNamesSet = [NSSet initWithArray:categories]; 

может быть, я сделал что-то неправильно, но оно не совсем работа:/

Что я заинтересован в том, что если есть решение, которое может значительно ускорить этот процесс? что-то, что я мог упустить.

Любые идеи?

+0

есть ли проблема с 'NSMutableSet * allCategoryNamesSet = [NSMutableSet setWithArray: allObjects];'? –

+0

есть. то я получаю набор, состоящий из объектов вместо атрибутов категории объектов. Мне нужен набор всех имен категорий, которые использовались в течение месяца :) –

ответ

3

Если вы заинтересованы только в (отчетливым) значение атрибута category установите

[request setResultType:NSDictionaryResultType]; 
[request setPropertiesToFetch:@[@"category"]]; 
[request setReturnsDistinctResults:YES]; 

для запроса выборки. Затем запрос на выборку возвращает массив словарей (вместо управляемых объектов), содержащих значения category.

Преимущество в том, что эта «фильтрация» выполняется на уровне SQLite. Один недостаток (или «оговорка») заключается в том, что это подразумевает setIncludesPendingChanges:NO, то есть запрос на выборку выполняется только для сохраненной базы данных и не включает несохраненные ожидающие изменения.

+0

На самом деле это все, что меня интересует! a даст ему поход сегодня, но это выглядит очень многообещающе! большой +1 и, вероятно, принять позже сегодня :) –

+0

работал отлично и быстро! Спасибо большое :) –

1

Оформить заказ MagicalRecord, который является библиотекой удобства для работы с основными данными. Это должно помочь вам выполнить многие из этих задач.

Удачи.

+0

Большое вам спасибо за эту ссылку! я буду использовать его в будущих проектах. Приложение уже находится в appstore, поэтому я больше не пойду и не изменю настройку coredata. Этот вопрос предназначен для новой версии проекта. но +1 за большой намек :) –

Смежные вопросы