2010-12-01 4 views
0

UITableViewのリストから選択した項目の詳細な情報を持つUIWebViewに進むプロセスを円滑にするために、情報にアクセスしながら、読み込み中のアニメーションを表示するためにMBProgressHUDを使用しようとしています。私が[self fetchPlayer]を呼び出した場合。私はMBProgressHUDを使わずに問題はなく、アニメーションを使わなくてもすべてうまく動作します。しかし、私が[self loadingAnimation]と呼ぶと、それは半分働く。初めて私がUITableViewから何かを選択すると、毎回正しくロードされますが、同じまたは異なるアイテムを選択して戻すと、playerDetailsアイテムのnull値が頻繁に取得されます。私はMBProgressHUDメソッドがこれを引き起こすために何をしているのかわからないが、ここにコードがある。 NSLogは正しい情報を表示していますが、2つのメソッドを呼び出すメインクラスは正しく出力しません。MBProgressHUDデータ出力を変更しますか?

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

答えて

1

これは少なくともスレッディングに関する問題のようです。 fetchPlayerはMBProgressHUDによってバックグラウンドスレッドで実行されるため、複数のスレッド間でコンテキストを共有しています。

バックグラウンドスレッドで新しいコンテキストを作成し、NSManagedObjectsがスレッド間で共有されていないことを確認します。

関連する問題