2012-04-15 2 views
0

몇 시간이 걸리는 UI 요소를 인스턴스화하는 동안 진행률 막대를 업데이트하고 싶습니다. 우선 viewLoad 메서드에서 내 뷰를 만들고 거기에 내 진행 막대를 추가합니다. viewDidAppear 메서드에서 내보기가 나타난 후에는 여러 개의 Uikit 개체 인스턴스를 만들고 있지만 평균 시간 내에 진행률 막대를 업데이트하고 싶습니다. 나는 모든 요소가 주 요소에서 발생하기 때문에 어떻게 진행해야할지 모르겠습니다.시간 소비 UI 요소를 인스턴스화하는 동안 진행률 막대를 업데이트하는 방법은 무엇입니까?

-(void) viewDidAppear:(BOOL)animated 
{ 
    // precompute the source and destination view screenshots for the custom segue 
    self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]]; 

    [self.progressBar setProgress:.3]; 


    SCLViewController *rvc = [[SCLViewController alloc] init]; 
    UIView *destinationView = rvc.view; 
    destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape); 


    self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]]; 

    [self.progressBar setProgress:.5]; 

} 

난 그냥 나중에 그들을 사용하는 두 개의 뷰 스크린 샷을 만들 필요가 위의 코드에서 : 여기

내 코드의 일부입니다. 문제는 진행률 표시 줄에 진행률을 설정할 때 마지막 업데이트 (.5) 만 표시된다는 것입니다. 이 업데이트를 수행하는 적절한 방법은 무엇입니까?

답변

0

무거운보기를 인스턴스화하기 위해 performSelectorInBackground:withObject: 메서드를 사용할 수 있습니다. 이 방법 (보기를 인스턴스화하는 방법)은 주 스레드에서 진행률 표시 줄 진행률을 설정해야합니다.

그래서 코드는 다음과 같을 것이다 :

- (void)viewDidAppear:(BOOL)animated 
{ 
    [self performSelectorInBackground:@selector(instantiateHeavyViews) withObject:nil]; 
} 

- (void)instantiateHeavyViews 
{ 
    self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]]; 
    [self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.3f] waitUntilDone:YES]; 

    SCLViewController *rvc = [[SCLViewController alloc] init]; 
    UIView *destinationView = rvc.view; 
    destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape); 

    self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]]; 

    [self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.5f] waitUntilDone:YES]; 
} 

- (void)updateMyProgressView:(NSNumber *)progress 
{ 
    [self.progressBar setProgress:[progress floatValue]]; 
} 

편집 : 물론, 그것은 당신의 진행률 표시 줄 애니메이션을하지 않습니다 (즉, 당신이 원하는 어떤 경우 나도 몰라). 보기가 생성되는 동안 계속 이동하려면 대리자를 사용하여 진행 상황을 통보해야하며,이 작업은 조금 더 어려울 수 있습니다. 이렇게하면 대리인에게 알릴 때마다 진행률 표시 줄을 업데이트 할 수 있습니다.

+0

작동합니다. - 감사합니다! 그래서 그것은 OK입니다 백그라운드 스레드에서 일부 UIVIew 인스턴스화합니까? Uikit 객체의 모든 조작은 주 스레드에서만 수행되어야한다고 생각했습니다. 또한 각 인스턴스 생성 후에 설정 한 단계에 도달 할 때까지 진행 상황을 부드럽게 유지하는 방법에 대해 좀 더 자세히 설명 할 수 있습니까? – tiguero

+0

예, 백그라운드 스레드에서보기를 인스턴스화 할 수 있습니다. 주 스레드에서해야 할 일은 다시 그리기 (서브 뷰 추가 또는 일부 속성 수정)를 의미하는 모든 것입니다. 원활한 진행 상황에 대해 말씀 드렸듯이 진행 상황 표시 줄을 업데이트하기 위해 매 순간 어떤 상태에 있는지 알 수있는 디자인이 있어야합니다. 지금은 초기화가 언제 시작되고 언제 완료되는지 알 수 있습니다. 이 초기화가 일련의 알려진 단계 인 경우 해당 단계 사이에 코드를 추가하여 다른 사람 (대리인)에게 진행률 표시 줄을 업데이트하도록 할 수 있습니다. –

관련 문제