2014-12-04 1 views
0

뷰의 배경색을 흰색으로 깜박이고 다시 원래 색으로 되돌릴 함수를 작성하려고합니다. 내가 가지고있는 것은 :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을 완료해야합니다. 별도의 스레드, 그리고 (중첩 된 폐쇄에 신호 것 세마포어에서 대기 후) 반환해야하는 기능에. 나는 무엇을 오해하고 있어요?

감사합니다!

답변

2

애니메이션 블록, 메인 스레드에서 실행하고 dispatch_semaphore_wait 블록을 메인 스레드. 그래서 애니메이션 블록이 실행되지 않습니다.

이것은 하나의 해결책입니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in 
     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER) 
     println("Returning") 
    }) 

다른 솔루션 현재 위치 :
How do I wait for an asynchronously dispatched block to finish?

+0

애플의 설명서를 명시 적으로 새로운 스레드가 애니메이션 완료 스핀 업하고 있다고 말했습니다 (원래의 질문에있는 링크에서) : 이 코드가 실행'의 지정된 애니메이션이 다른 스레드에서 즉시 시작되어 현재 스레드 나 응용 프로그램의 주 스레드를 막지 않도록합니다. " –

+0

저는 Apple이 애니메이션 블록이 비동기 적으로 실행되어 메인 스레드를 막지 않는다고 말합니다. 이것은 애니메이션이 하위 스레드에서 실행된다는 것을 의미하지 않습니다. "NSThread.isMainThread()"를 사용하여 코드가 실행되는 스레드를 확인할 수 있습니다. – bluedome