2014-09-28 1 views
2

아래 코드를 고려하십시오. 이 작업이 실행되면 활동 표시기가 나타나고 움직이며, 동시에 "테스트"가 콘솔에 반복적으로 기록됩니다. 왜?메인 스레드가 차단되었을 때 UIKit은 어떻게 애니메이션 UIActivityIndicator를 그립니까?

"indentor"의 다음 다시 그리기 전에 "test"블록이 메인 큐에서 실행되고 블록이 결코 실행을 완료하지 않기 때문에 활동 표시기가 화면에 나타나기는하지만 애니메이션에 실패 할 것으로 예상됩니다.

UIKit이 주 스레드에서 활동 표시기를 그리지 않습니까?

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIActivityIndicatorView *v = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [self.view addSubview:v]; 
    v.center = self.view.center; 
    [v startAnimating]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    while (1) { 
     NSLog(@"test"); 
    } 
    }); 
} 
+0

분명히 모든 애니메이션은 Apple이 다른 스레드에서 타이머로 구현 한 것입니다.이 스레드는 계속해서 (예 : 20hz 등) UI에 프레임 변경을 알립니다. – Fattie

답변

0

는 코어 애니메이션 프로그래밍 가이드

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimation_guide.pdf

미국 있음 :

는 정적 비트 맵을 조작하기 때문에

, 레이어 기반이 전통적인에서 differssignificantly 도면 뷰 기반 그림 그리기. 뷰 기반 드로잉을 사용하면 뷰 자체를 변경하면 뷰의 drawRect : 메소드가 호출되어 새로운 파라미터를 사용하여 콘텐트를 다시 그릴 수 있습니다. 그러나이 방법으로 드로잉은 메인 스레드의 CPU를 사용하여 수행되므로 비용이 많이 듭니다. Core Animation은 하드웨어의 캐시 된 비트 맵을 조작하여 가능할 때마다이 비용을 피하여 동일하거나 유사한 효과를 얻습니다.

모든 그림이 주 스레드에서 발생하지는 않습니다.