2010-12-01 9 views
0

Ich versuche, MBProgressHUD zu verwenden, um eine Ladeanimation anzuzeigen, während ich auf Informationen zugreife, um den Übergang von einem UITableView-Eintrag zu einem UIWebView, der detaillierte Informationen zum ausgewählten Eintrag enthält, zu glätten. Wenn ich [self fetchPlayer] anrufe; ohne MBProgressHUD habe ich keine Probleme und alles funktioniert gut, wenn auch ohne die Animation. Aber wenn ich [Self loadingAnimation] anrufe; es funktioniert zur Hälfte. Das erste Mal, wenn ich etwas aus dem UITableView wähle, wird es jedes Mal korrekt geladen, aber wenn ich zurückgehe und dasselbe oder ein anderes Element auswähle, bekomme ich oft Nullwerte für playerDetails Elemente. Ich bin mir nicht sicher, was die MBProgressHUD-Methode tun könnte, um dies zu verursachen, aber hier ist der Code. Der NSLog zeigt die richtigen Informationen an - aber die Hauptklasse, die die beiden Methoden aufruft, gibt sie nicht korrekt aus.MBProgressHUD ändert die Datenausgabe?

- (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]; 
} 

Antwort

1

Dies scheint zumindest ein Problem mit Threading zu sein. Sie teilen Ihren Kontext über mehrere Threads hinweg, während fetchPlayer in einem Hintergrundthread von MBProgressHUD ausgeführt wird.

Erstellen Sie einen neuen Kontext im Hintergrundthread und stellen Sie sicher, dass NSManagedObjects nicht über Threads gemeinsam genutzt werden.

Verwandte Themen