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()”检查代码在其中执行的线程。