2010-12-01 11 views
0

J'essaie d'utiliser MBProgressHUD pour afficher une animation de chargement pendant que j'accède à des informations pour faciliter le passage d'une liste UITableView à une UIWebView qui contient des informations détaillées sur l'élément sélectionné. Si j'appelle [self fetchPlayer]; sans utiliser MBProgressHUD je n'ai aucun problème et tout fonctionne bien mais sans l'animation. Mais si j'appelle [auto loadingAnimation]; ça marche à moitié. La première fois que je sélectionne quelque chose à partir de UITableView, il se charge correctement à chaque fois, mais si je retourne en arrière et que je sélectionne le même élément ou un élément différent, j'obtiendrai souvent des valeurs nulles pour les éléments de playerDetails. Je ne suis pas sûr de ce que la méthode MBProgressHUD pourrait faire pour provoquer cela mais voici le code. Le NSLog affiche l'information correcte - mais la classe principale qui appelle les deux méthodes ne le sort pas correctement.MBProgressHUD modifiant la sortie de données?

- (void)loadingAnimation { 
// The hud will dispable all input on the view (use the higest view possible in the view hierarchy) 
    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; 

    // Add HUD to screen 
    [self.navigationController.view addSubview:HUD]; 

    HUD.labelText = @"Loading"; 

    // Show the HUD while the provided method executes in a new thread 
[HUD showWhileExecuting:@selector(fetchPlayer) onTarget:self withObject:nil animated:YES]; 
} 


- (void)fetchPlayer { 
NSManagedObjectContext *pcontext = [[AppController sharedAppController] managedObjectContext]; 

NSFetchRequest *pfetch = [[NSFetchRequest alloc] init]; 

NSEntityDescription *pentity = [NSEntityDescription entityForName:@"Players" 
       inManagedObjectContext:pcontext]; 
[pfetch setEntity:pentity]; 

NSPredicate *ppredicate = [NSPredicate predicateWithFormat:@"playerID=%@", [playerNews playerID]]; 
[pfetch setPredicate:ppredicate]; 

NSError *perror; 
NSArray *plist = [pcontext executeFetchRequest:pfetch error:&perror]; 

playerDetails = [plist objectAtIndex:0]; 

NSLog(@"%@ %@ %@ %@ %@", [playerNews playerID], 
     [playerDetails valueForKey:@"playerFirstName"], 
     [playerDetails valueForKey:@"playerLastName"], 
     [playerDetails valueForKey:@"position"], 
     [playerDetails valueForKey:@"dateOfBirth"]); 

[pfetch release]; 

NSManagedObjectContext *context = [[AppController sharedAppController] managedObjectContext]; 

NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Teams" 
      inManagedObjectContext:context]; 
[fetch setEntity:entity]; 

if (![playerDetails valueForKey:@"team"]) { 
    team = [playerDetail team]; 
} else { 
    team = [playerDetails valueForKey:@"team"]; 

} 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"team=%@", team]; 

[fetch setPredicate:predicate]; 

NSError *error; 
NSArray *list = [context executeFetchRequest:fetch error:&error]; 

playerTeam = [list objectAtIndex:0]; 

[fetch release]; 
} 

Répondre

1

Cela semble être au moins un problème avec le filetage. Vous partagez votre contexte sur plusieurs threads lorsque fetchPlayer est exécuté dans un thread d'arrière-plan par MBProgressHUD.

Créez un nouveau contexte dans le thread d'arrière-plan et assurez-vous que NSManagedObjects ne sont pas partagés entre les threads.