2013-11-26 3 views
1

다음 코드에서는 재귀를 사용하여 트리에서 xml 태그의 내용을 얻으려고합니다. 문제는 태그가 발견되었지만 self에 대한 모든 호출이 새 스레드를 시작하므로 결국 반환 값은 NOT_FOUND이지만 이전에 발견 된 경우 중지되어야합니다. 도전 .. 어떤 도움 포인터가 이해할 수있을 것이다 종료 조건을 설정하기 위해 while 루프재귀 및 목표 C

retValue = [self valueOf:anElement :tag]; 
if(![retValue isEqualToString:@"NOT_FOUND"]){ 
    break; 
} 

당신은 내부 메서드 호출의 반환 값을 사용하지 않는에서

// Recursive method to find a XmlElement value 
- (NSString*) valueOf : (XMLElement*) elementIn :(NSString*) tag 
{ 
    NSString *retValue = @"NOT_FOUND"; 

    if ([self tagMatch:elementIn :tag]){ 
     retValue = elementIn.text; 
     found = 1; 
    } else { 
     for (XMLElement *anElement in elementIn.subElements) 
     { 
      [self valueOf:anElement :tag]; 
     } 
    } 
    return retValue; 
} 

- (int) tagMatch : (XMLElement*) elementIn :(NSString*) tag 
{ 
    int found = 0; 

    if([elementIn.name isEqualToString:tag]) { 
     NSLog (@"Found tag %@, value = %@", tag, elementIn.text); 
     found = 1; 
    } 
    return found; 
} 
+0

나는 새 스레드를 시작하는 코드를 볼 수 없습니다를? – trojanfoe

+0

Xcode를 사용하여 디버깅 할 때 디버그 창에 새 스레드가 생성 된 것을 볼 수 있습니다. Xcode 및 objc을 처음 사용하여 미안합니다. – rajeevs

+0

게시 한 코드에 새 스레드가 생성되지 않으므로 해당 스레드를 다른 곳에 만들어야합니다. 그렇다면이 코드의 문제점은 무엇입니까? – trojanfoe

답변

3

입니다.

+0

그 소년은 빠르다. 고마워, 알렉스 - 알았다. 당신의 도움을 주셔서 감사합니다. – rajeevs

3

nil의 값을 사용하여 을 찾을 수 없다는 것을 쉽게 알 수 있습니다. 테스트하기가 더 쉽기 때문에입니다. 당신은 항상 프리젠 테이션 동안 @"Not Found"로 값을 변경할 수 있습니다 (즉, 사용자가 UI 요소에 문자열을 추가 할 때) :

- (NSString *)valueOf:(XMLElement*)elementIn:(NSString*)tag 
{ 
    NSString *retValue = nil; 

    if ([self tagMatch:elementIn:tag]) { 
     retValue = elementIn.text; 
    } else { 
     for (XMLElement *anElement in elementIn.subElements) { 
      if (retValue = [self valueOf:elementIn:tag]) 
       break; 
     } 
    } 
    return retValue; 
}