Вопрос

У меня есть метод, который считывает 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: способ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top