2010-07-11 3 views
0

코어 데이터에 데이터를 원격으로로드하는 ipad 앱이 있습니다. 라벨에 상태 업데이트를 지속적으로 표시했지만 메시지가 UILabel로 전송되기 전에 내 메소드의 모든 것이 완료되어야합니다.ipad 앱에서 실시간 정보를 사용자에게 표시 하시겠습니까?

어떻게이 문제를 해결할 수 있습니까?

샘플 코드 : importStatus 위의 코드에서

-(void) importCollections { 
/* code left out for brevity */ 

    for (int j=0; j <[[myCollections objectAtIndex:i] count]; j++) 
      { 

       Collection *entity = (Collection*) [NSEntityDescription insertNewObjectForEntityForName:@"Collection" inManagedObjectContext:managedObjectContext]; 
       [entity setCollectionName:[[[myCollections objectAtIndex:i] objectAtIndex:j] valueForKey:@"CollectionName"]]; 
       [entity setCollectionID:[[[myCollections objectAtIndex:i] objectAtIndex:j] valueForKey:@"CollectionID"]]; 
       [entity setManufacturer:[manufacturers objectAtIndex:i]]; 

       NSError *error; 

       if (![managedObjectContext save:&error]) { 
        // Handle the error. 
        NSLog(@"%@",error); 
       } 
       importStatus.text =[NSString stringWithFormat:@"importing collection: %@", entity.CollectionName]; 
      } 
} 

내가 지속적으로 업데이트 할 필요가있는 UILabel의, 그러나이 방법의 모든이 완료 될 때까지 기다려야 할 것 같다.

답변

1

아마도 메인 스레드에서 importCollections으로 전화하십시오. 이렇게하면 UIKit에 주 스레드를 차단하고 실행 루프로 돌아 가지 않는 한 UI를 업데이트 할 기회가 없습니다.

오랜 시간 동안 계산하거나 백그라운드 스레드에서 리소스를로드해야합니다. 메인 스레드에서만 UI 요소를 업데이트 할 수 있기 때문에 UIKit 호출을 performSelectorOnMainThread:withObject:waitUntilDone:으로 랩핑해야합니다.

+0

은 의미가 있습니다. 따라서 백그라운드 스레드에서 가져 오는 모든 작업을 중단하고 메인 스레드의 UILabel에 메시지를 보내고 사용자에게 계속 정보를 제공 할 수 있습니다. 올바르게 이해하고 있습니까? – Slee

+0

@Max Fraser : 정확합니다. 2 밀리 초보다 오래 걸리는 모든 작업은 백그라운드 스레드에서 수행해야합니다. 쓰레드 통신은 실행 루프 아키텍처와 performSelectorOnThread ... NSObject의 API 덕분에 Cocoa에서 쉽습니다. –

관련 문제