2011-04-08 2 views
1

NSXMLParser를 통해 XML 데이터를 UITableView로로드하는 응용 프로그램이 있습니다. 이 모든 것이 완벽하게 작동했습니다. ActivityIndicator를 추가하기를 원했기 때문에로드 데이터를 다른 스레드에 배치 한 다음 메인에 배치해야합니다. 이 작업을 수행 한 후에도 XML은 내 응용 프로그램과 함께로드되지만 내 테이블에는 아무 것도 표시되지 않습니다. 내 tabbarcontroller의 다른 탭을 클릭 한 다음 테이블을 다시 클릭하면 테이블의 데이터가 표시됩니다. 무슨 일 이니?NSThread에서 XMLParser 오류

내 파일 :

#import "DAFAppDelegate.h" 
#import "RootViewController.h" 
#import "XMLParser.h" 


@implementation DAFAppDelegate 

@synthesize window; 
@synthesize navigationController; 
@synthesize rootViewController; 
@synthesize rootTabController; 
@synthesize stages; 

+ (void) showAlert 
{ 
    UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"No Connection" message:@"Could not retrieve data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease]; 
    [av show]; 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    [window addSubview:[rootTabController view]]; 
    [window makeKeyAndVisible]; 

    [NSThread detachNewThreadSelector:@selector(parseXML) toTarget:self withObject:nil]; 
} 

- (void) parseXML 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
    NSURL *url = [[NSURL alloc] initWithString:@"http://web.me.com/ijar/Stages.xml"]; 
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

    //Initialize the delegate. 
    XMLParser *parser = [[XMLParser alloc] initXMLParser]; 

    //Set delegate 
    [xmlParser setDelegate:parser]; 

    //Start parsing the XML file. 
    BOOL success = [xmlParser parse]; 

    if(success) 
    { 
     NSLog(@"No Errors"); 
    } 
    else 
    { 
     [DAFAppDelegate showAlert]; 
     NSLog(@"Error Error Error!!!"); 
    } 

    [pool release]; 

} 

- (void)dealloc 
{ 
    [navigationController release]; 
    [rootViewController release]; 
    [rootTabController release]; 
    [window release]; 
    [stages release]; 
    [super dealloc]; 
} 

@end 

답변

0

당신이 당신의 테이블보기에 reloadData 전화를 했습니까? 또한 -performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait을 사용하여 테이블보기로 메시지를 보내야합니다.

파서가 성공하면이 메시지를 보내야합니다.

if (succeed) 
{ 
    [myTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 
} 

거기에서 다음 데이터 저장소와의 업데이트하기 위해 테이블 ​​뷰의 데이터 소스 개체를 호출하는 것이 더있을 수 있습니다, 데이터를 업데이트 할 테이블 뷰를 말한다.

+0

아니요이 reloadData 및 -performSelectorOnMainThread는 어디에 배치해야합니까? (SEL) aSelector withObject : (id) arg waitUntilDone : (BOOL) wait? 바보 같은 질문에 사과드립니다. 그러나 나는 이것에 초보자입니다. 책을 읽고 읽음으로써 배우기 시작. 모든 도움을 환영합니다 :-) – iJar

+0

파서 성공 메시지 아래의 코드에 배치했습니다. 내 dataReload 메서드는 내 rootViewController에서 다음과 같이 보입니다. - (void) updateTable : (NSMutableArray *) data { \t appDelegate.stages = data; \t [self.tableView reloadData]; \t } 이제 내 컴파일러는 데이터가로드되는 순간 오류가 발생합니다. – iJar

+0

그래서 오류가 무엇입니까? – David

관련 문제