2013-03-07 4 views
1

사용자가 인쇄 할 이미지를 생성하는 클래스가 있습니다. 이러한 이미지는 QuartzCore (및 일부 UIKit 요소)를 사용하여 생성되며 주 스레드에서 실행해야합니다.인쇄 된 페이지를 생성하는 동안 진행률 막대를 업데이트하십시오.

이미지가 생성되는 동안 사용자가 볼 수있는보기에서 진행률 표시 줄이 있습니다. 이 뷰는 인쇄를 수행하는 클래스의 대리자이며 뷰에서 프린터가 메서드를 호출하여 진행률 막대를 업데이트합니다. 문제는 프린터가 주 스레드를 막히게되어 프린터가 완료 될 때까지 진행률 표시 줄이 눈에 띄게 업데이트되지 않는다는 것입니다. 모든 UI 업데이트가 주 스레드에서 수행되어야하기 때문에 주 스레드에서 진행 표시 줄을 끌 수 없습니다.

저는 멀티 스레딩을 처음 접했습니다. 다른 옵션이 있습니까? 아니면 액티비티 인디케이터 또는 이와 비슷한 옵션을 사용해야합니까?

+1

백그라운드 스레드에서 이미지를 생성하는 것이 안전해야한다. 메인 스레드에서 진행률 표시 줄의 업데이트를 그대로 둡니다. – rmaddy

+0

@rmaddy 만약 당신이 대답했다 upvote 줄. ;) –

+0

@JacobRelkin 완료. – rmaddy

답변

1

이미지 업데이트가 백그라운드 스레드에서 수행되도록 코드를 업데이트하십시오. 이것은 안전해야합니다.

그러면 주 스레드로 전화를 걸어 진행률 표시 줄을 업데이트 할 수 있습니다. 당신은 GCD을 사용할 수 있습니다

+0

Apple 엔지니어는 이것을 "상자 내의 상자"패러다임이라고 부릅니다. 새 "상자"또는 무거운 짐을 들어있는 대기열을 만듭니다. 그런 다음 위의 대기열에서 기본 대기열로 이동하여 UI를 업데이트합니다. 이것은 매우 일반적인 관행입니다. –

0

, Raywenderlich Tutorial

- (void)generatePage 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
     /* 
      Here you can generate page and update progress 
      For example: 
     */ 
     [self updateProgress:10.0f]; 
     sleep(1000); 
     [self updateProgress:20.0f]; 
     sleep(3000); 
     [self updateProgress:100.0f]; 
    }); 
} 

- (void)updateProgress:(float)progress 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     progressView.progress = progress; 
    }); 
}