2010-12-01 5 views
0

UITableView 목록에서 선택한 항목에 대한 자세한 정보가있는 UIWebView로 이동하는 과정을 원활하게하기 위해 정보에 액세스하는 동안로드 애니메이션을 표시하기 위해 MBProgressHUD를 사용하려고합니다. [self fetchPlayer]를 호출하면; MBProgressHUD를 사용하지 않고도 아무런 문제가 없으며 애니메이션 없이도 모든 것이 잘 작동합니다. 그러나 [self loadingAnimation]을 호출하면; 그것 절반 작동합니다. 처음으로 내가 UITableView에서 무언가를 선택할 때마다 매번 올바르게로드되지만, 돌아가서 동일하거나 다른 항목을 선택하면 상당히 자주 playerDetails 항목에 null 값을 가져옵니다. MBProgressHUD 메서드가이 문제를 일으킬 수 있는지 모르겠지만 여기에 코드가 있습니다. NSLog가 올바른 정보를 표시하고 있지만 두 메소드를 호출하는 주 클래스가 올바르게 출력하지 않습니다.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가 스레드간에 공유되지 않는지 확인하십시오.