2010-09-29 2 views
0

Итак, я получил сущности уровня и плитки. У уровня есть много отношений с Tile. Плитка имеет индекс собственности.Могу ли я использовать переменные экземпляра с NSManagedObject?

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

- (NSArray *)sortedTiles 
{ 
    NSMutableArray *sortedTiles = [NSMutableArray arrayWithArray:[self.tiles allObjects]]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"index" ascending:YES]; 
    [sortedTiles sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
    [sortDescriptor release]; 
    return sortedTiles; 
} 

Это работает, но я хочу, чтобы иметь возможность получить один Плитку с определенным индексом, так что я написал этот метод в Level.h:

- (Tile *)tileWithIndex:(NSInteger)index; 

реализация довольно проста:

- (Tile *)tileWithIndex:(NSInteger)index 
{ 
    NSArray *sortedTiles = [self sortedTiles]; 
    Tile *tile = [sortedTiles objectAtIndex:index]; 
    return tile; 
} 

Теперь, Конечно, это не самый эффективный способ сделать это, потому что массив плиток нужно распределять и сортировать каждый раз, поэтому я думал: если я просто добавлю переменную экземпляра в Level, 'sortedTiles', тогда у меня не будет перестраивать его каждый раз. Но Level является подклассом NSManagedObject, так и возможно ли это и/или разумно?

+0

Пожалуйста, правильно отформатируйте свой код. –

+0

Хотел бы, но не мог заставить его работать. Я использую 4 пробела, прежде чем некоторые строки будут отступать, но это просто не будет отступать ... Редактировать: извините, полностью неправильно поняли ссылку на форматирование. Исправлена. – Rits

ответ

0

Я бы не стал. NSManagedObjects являются отражением записи в базе данных и добавление дополнительных переменных-членов за пределами модели поражает меня как добавление чего-то, что не принадлежит.

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

Для больших или сложных ситуаций вы можете использовать NSFetchRequestController для сбора, сортировки и заполнения NSManagedObjects при необходимости. Это прекрасно сочетается с UITableViewController. Я не тестировал тестирование производительности, но для ситуации, когда потенциально существует большое количество записей, я попытался бы это сделать первым, чтобы проверить, достаточно ли собственного класса управления выборками для управления кешем.

+0

Я не уверен, что согласен, что вы не должны добавлять iVars в подкласс NSManagedObject в целом. Пока эти iVars не предназначены для сохранения, и их аксессоры учитывают состояние isFault экземпляра, существует множество допустимых и полезных применений. Что касается использования OP, я не уверен, что полностью понимаю этот вопрос, но я «чувствую», как будто это слишком много. :-) –

+0

Можете ли вы привести пример? Я изо всех сил пытаюсь найти даже тот, который (1) лучше не хранится в контроллере или делегирует управление приложением, представлением или использованием случая, и (2) не вызывает проблем, когда есть несколько NSManagedObjectContexts, каждый из которых имеет версии объекта. –

+0

Основным преимуществом использования переменной экземпляра будет оптимизация метода уровня tileWithIndex:. Прямо сейчас, каждый раз, когда я вызываю этот метод, sortedTiles необходимо перестроить. Если я храню sortedTiles в переменной экземпляра уровня, я могу просто использовать эту переменную каждый раз. – Rits

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