뷰의 배경색을 흰색으로 깜박이고 다시 원래 색으로 되돌릴 함수를 작성하려고합니다. 내가 가지고있는 것은 :UIView.animateWithDuration이 세마포어로 실행되지 않습니다.
func flashView(view: UIView) {
var sema = dispatch_semaphore_create(0)
var color = view.backgroundColor
println("Animating")
UIView.animateWithDuration(0.5, animations: { view.backgroundColor = UIColor.whiteColor() }) {
(success: Bool) in
println("First block completion")
UIView.animateWithDuration(0.5, animations: { view.backgroundColor = color }) {
(success: Bool) in
println("Nested block completion")
dispatch_semaphore_signal(sema)
}
}
println("Waiting")
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
println("Returning")
}
지금, 내가 겪고있어하는 것은 Animating
메시지가 Waiting
다음에 표시 할 것입니다. 첫 번째 animateWithDuration
블록은 결코 실행되지 않습니다. (중첩 된 블록도 마찬가지입니다.) 그러나 Apple 자신의 documentation에 따르면 UIView.animateWithDuration
은 별도의 스레드에서 발생하므로 내 이해는 세마포어가 대기해야한다는 것입니다. animateWithDuration
을 완료해야합니다. 별도의 스레드, 그리고 (중첩 된 폐쇄에 신호 것 세마포어에서 대기 후) 반환해야하는 기능에. 나는 무엇을 오해하고 있어요?
감사합니다!
애플의 설명서를 명시 적으로 새로운 스레드가 애니메이션 완료 스핀 업하고 있다고 말했습니다 (원래의 질문에있는 링크에서) : 이 코드가 실행'의 지정된 애니메이션이 다른 스레드에서 즉시 시작되어 현재 스레드 나 응용 프로그램의 주 스레드를 막지 않도록합니다. " –
저는 Apple이 애니메이션 블록이 비동기 적으로 실행되어 메인 스레드를 막지 않는다고 말합니다. 이것은 애니메이션이 하위 스레드에서 실행된다는 것을 의미하지 않습니다. "NSThread.isMainThread()"를 사용하여 코드가 실행되는 스레드를 확인할 수 있습니다. – bluedome