Animation UIView.animateWithDuration未使用信号量执行

Animation UIView.animateWithDuration未使用信号量执行,animation,swift,grand-central-dispatch,Animation,Swift,Grand Central Dispatch,我正在尝试编写一个函数,将视图的背景颜色闪烁为白色,然后恢复为原始颜色。我得到的是: func flashView(view: UIView) { var sema = dispatch_semaphore_create(0) var color = view.backgroundColor println("Animating") UIView.animateWithDuration(0.5, animations: { view.backgroundColor

我正在尝试编写一个函数,将视图的背景颜色闪烁为白色,然后恢复为原始颜色。我得到的是:

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")
}
现在,我所经历的是,
动画
消息将显示,然后是
等待
。第一个
animateWithDuration
块永远不会执行(不用说嵌套的也不是。但是,根据苹果自己的
UIView.animateWithDuration
在一个单独的线程上发生。因此,我的理解是,信号灯应该等待,
animateWithDuration
应该在一个单独的线程上完成,函数应该返回。)(在等待嵌套闭包中发出信号的信号量之后)。我误解了什么


谢谢!

动画块在主线程中执行,而您的调度信号量等待会阻塞主线程。 所以动画块永远不会执行

这是一个解决方案

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
        println("Returning")
    })
其他解决方案如下:

苹果的文档(来自原始问题中的链接)明确地说,新线程被旋转起来以完成动画:
当此代码执行时,指定的动画会立即在另一个线程上启动,以避免阻塞当前线程或应用程序的主线程。
我认为苹果说动画块异步执行不是为了阻止主线程。这并不意味着动画在子线程中执行。您可以通过“NSThread.isMainThread()”检查代码在其中执行的线程。