2011-04-08 4 views
1

J'ai une application dans laquelle je charge mes données XML via le NSXMLParser dans un UITableView. Tout a parfaitement fonctionné. Parce que je voulais ajouter un ActivityIndicator, je dois placer mes données de chargement sur un thread différent, puis le principal. Après avoir fait cela, le XML est chargé ainsi que mon application mais je ne vois rien dans ma table. Lorsque je clique sur un autre onglet de mon contrôleur de tabulation et que je clique de nouveau sur le tableau, les données de la table deviennent visibles. Qu'est-ce qui ne va pas?Erreur XMLParser avec NSThread

Mon fichier:

#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 

Répondre

0

Avez-vous appelé reloadData votre point de vue de la table? Aussi, vous devriez envoyer le message à la vue de table en utilisant -performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait.

Vous devriez envoyer ces messages si votre analyseur a réussi.

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

Il pourrait être préférable d'appeler l'objet DataSource de votre vue de la table pour mettre à jour son magasin de données, puis de là, dire la vue de la table pour mettre à jour ses données.

+0

Non où dois-je placer cette reloadData et -performSelectorOnMainThread: (SEL) aSelector withObject: (id) arg waitUntilDone: (BOOL) wait? Désolé pour les questions stupides. Mais je suis un débutant à ce sujet. Commencer à apprendre en faisant et en lisant des livres. Toute l'aide est la bienvenue :-) – iJar

+0

Je l'ai placé dans le code maintenant sous le message parser réussi. et ma méthode dataReload ressemble à ceci dans mon rootViewController: - (void) updateTable: (NSMutableArray *) données { \t appDelegate.stages = data; \t [self.tableView reloadData]; \t } Maintenant, mon compilateur donne une erreur au moment où les données sont chargées. – iJar

+0

Alors, quelle est l'erreur? – David