2014-10-07 2 views
2

이 주제를 더 잘 이해하려고합니다. 이 자동으로 main_queue에 추가 않습니다 나는 그 애니메이션 블록 때문에 다음UIView 애니메이션 블록 및 dispatch_async (dispatch_get_main_queue) 블록 이해

- (void)coolAnimation 
{ 
    [UIView animateWithDuration: some duration 
        animations:^{ some animation }]; 
} 

같은 몇 가지 정말 멋진 애니메이션을하고 싶은 말은하자? 또는 모범 사례로, 나는 main_queue에 UI 업데이트를 항상 다음과 같이 추가해야한다.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self coolAnimation]; 
}); 

답변

8

블록 내용은 [UIView animateWithDuration:animations:]에 관계없이 주 스레드에서 수행됩니다. OS가 애니메이션을 실행하게하는 것이 가장 좋습니다. 애니메이션 스레드는 메인 스레드를 차단하지 않고 애니메이션 블록 자체 만 차단합니다.

매우 높은 수준의 손으로 볼 수있는 이런 종류의보기에서 [UIView animateWithDuration:animations:]은 블록을 평가하고 그 안에있는 각 애니메이션 가능한 값에 대한 기능을 결정합니다. OS에는 프레임 타이머로 사용하는 애니메이션 스레드가 있습니다. 그런 다음 각 틱에서 주 스레드의 업데이트를 진행 값으로 애니메이션 속성에 보냅니다. (프레젠테이션 레이어에서이 값의 현재 상태를 확인할 수 있습니다.)

1

당신이 전달하는 애니메이션 블록은 즉시라고합니다. 대기열을 사용할 필요가 없습니다.

관련 문제