NSArray для основных элементов данных
Вопрос
У меня есть метод, который считывает XML-файл и сохраняет xml-узлы по определенному XPath-пути в NSArray с именем *nodes.Что я хочу сделать, это взять каждый из элементов в массиве и добавить его в основную сущность данных под названием Category с атрибутом "name".
Я перепробовал несколько различных способов создания объекта, но я не уверен в правильном способе сделать это эффективно.Это код, используемый для создания NSArray, есть идеи о том, как это реализовать?(игнорируйте NSError, я исправлю это в окончательной версии)
- (IBAction)readCategories:(id)sender
{
NSString *xmlString = [resultView string];
NSData *xmlData = [xmlString dataUsingEncoding: NSASCIIStringEncoding];
NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:xmlData options:nil error:nil];
//XPath
NSError *err=nil;
NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err];
}
РЕДАКТИРОВАТЬ - Мой код цикла
NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err];
int arrayCount = [nodes count];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLElement *categoryEl;
NSString *new = [catArrayController newObject];
int i;
for (i = 0; i < arrayCount; i++)
{
[categoryEl = [nodes objectAtIndex:i]];
[new setValue:[categoryEl stringValue] forKey:@"name"];
[catArrayController addObject:new];
}
[pool release];
Решение
Вот как бы я это написал:
for (NSXMLElement *categoryElement in nodes) {
NSManagedObject *newObject = [catArrayController newObject];
[newObject setValue:[categoryElement stringValue] forKey:@"name"];
[catArrayController addObject:newObject];
[newObject release];
}
Во-первых, я использую синтаксис Objective-C 2.0 for-each.Это проще, чем использовать индексные переменные.Я устранил i
и arrayCount
.
Затем я достал твой NSAutoreleasePool
.Ни один из объектов в цикле не был автоматически выпущен, поэтому это не имело никакого эффекта.(Тот самый newObject
метод возвращает сохраненный объект, который, по соглашению, является тем, что используется со словом new
от их имени делаю) Именно поэтому я выпускаю newObject
после добавления его в контроллер массива.Поскольку я больше не собираюсь использовать его в этом методе, мне нужно освободить его.
Кроме того, вы определили new
(который я переименовал newObject
) в качестве NSString
.Объекты Core Data всегда являются либо экземпляром NSManagedObject
или подкласс NSManagedObject
.
Твоя реплика [categoryEl = [nodes objectAtIndex:i]]
не будет компилироваться.Это потому, что синтаксис скобок используется для отправки сообщения объекту.Это оператор присваивания, поэтому синтаксис скобок здесь не нужен.(Эта строка также больше не нужна, потому что я изменил цикл, чтобы использовать синтаксис for-each) Но, для дальнейшего использования, categoryEl = [nodes objectAtIndex:i];
это бы сработало.
Другие советы
С какой частью у вас возникли проблемы?В этом не должно быть ничего большего, чем перебор массива, создание нового управляемого объекта для каждой записи и установка правильных атрибутов.Вы можете создать управляемый объект с помощью NSEntityDescription -insertNewObjectForEntityForName:inManagedObjectContext:
способ.