문제

XML 파일을 읽고 XML 노드를 특정 XPATH-PATH에 *노드라는 NSARRAY에 저장하는 메소드가 있습니다. 내가하고 싶은 것은 배열의 각 항목을 가져 와서 "이름"속성으로 카테고리라는 핵심 데이터 엔티티에 추가하는 것입니다.

엔티티를 만드는 여러 가지 방법을 시도했지만 효과적으로 수행하는 올바른 방법에 대해서는 잘 모르겠습니다. 이것은 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];
}

먼저, TEAREIVE-C 2.0 맞은과의 구문을 사용하고 있습니다. 이것은 인덱스 변수를 사용하는 것보다 간단합니다. 나는 제거했다 i 그리고 arrayCount.

다음으로, 나는 당신을 꺼 냈습니다 NSAutoreleasePool. 루프의 객체 중 어느 것도 자동 정리되지 않았으므로 효과가 없었습니다. (그만큼 newObject 메소드는 컨벤션에 의해 단어와 어떤 메소드가되는지를 반환합니다. new 그들의 이름으로) 이것이 내가 릴리스하는 이유이기도합니다. newObject 배열 컨트롤러에 추가 한 후 이 방법에서 더 이상 사용하지 않으므로 해제해야합니다.

또한, 당신은 정의했습니다 new (내가 이름을 바꿨습니다 newObject)로서 NSString. 핵심 데이터 객체는 항상 인스턴스입니다 NSManagedObject 또는 서브 클래스 NSManagedObject.

당신의 라인 [categoryEl = [nodes objectAtIndex:i]] 컴파일하지 않습니다. 브래킷 구문이 객체에 메시지를 보내는 데 사용되기 때문입니다. 이것은 과제 명령문이므로 여기서는 브래킷 구문이 필요하지 않습니다. (이 라인도 더 이상 필요하지 않습니다. FOR-SCYNTAX를 사용하기 위해 루프를 변경했기 때문에). 그러나 향후 참조를 위해 categoryEl = [nodes objectAtIndex:i]; 일했을 것입니다.

다른 팁

어떤 부분에 문제가 있습니까? 배열을 반복하고 각 항목에 대한 새로운 관리 객체를 만들고 올바른 속성을 설정하는 것보다 훨씬 더 많은 것이 없어야합니다. nsentityDescription 's로 관리되는 객체를 만들 수 있습니다 -insertNewObjectForEntityForName:inManagedObjectContext: 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top