我正在尝试编写一个函数,将视图的背景颜色闪烁为白色,然后再恢复为原始颜色。我所拥有的是:
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
应该在一个单独的线程上完成,并且该函数应该返回(等待在嵌套闭包中发出信号的信号量之后)。我有什么误解?
谢谢!
答案 0 :(得分: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?