UIView.animateWithDuration(10, delay: 20, options: .TransitionNone, animations: {
}) { (let finish) in
print("finish")
}
与显示的代码一样,我希望在20秒后打印“完成”,但我立即得到它。
顺便说一下,有多少种方法会使操作延迟?
答案 0 :(得分:3)
第一种方法:NSTimer
func myDelayedFunction() {
print("delayed")
}
func myMainFunction() {
let timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "myDelayedFunction", userInfo: nil, repeats: false)
timer.fire()
}
第二种方法:performSelector
func myDelayedFunction() {
print("delayed")
}
func myMainFunction() {
performSelector("myDelayedFunction", withObject: self, afterDelay: 10)
}
第三种方法:GCD
(如果您需要匿名函数,则非常有用)
(改编自this answer)
let delayInSeconds: Int64 = 3
let popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * Int64(NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue()) {
print("Delayed")
}
第四种方法:sleep
func myMainFunction() {
sleep(10) //This will block whichever thread you're running on.
print("delayed")
}
我倾向于使用第一种方法,因为如果需要,我总是可以使计时器无效(调用timer.invalidate
)。但是,每种方法都有其用例。
答案 1 :(得分:1)
如果你真的不需要做任何动画,可以使用GCD来完成这个
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(20 * NSEC_PER_SEC)), dispatch_get_main_queue()){
print("finish")
};
你可以按照in this answer描述的那样制作一个整洁的小助手功能
答案 2 :(得分:1)
我认为,这是一种误解。在您的代码中:
UIView.animateWithDuration(10, delay: 20, options: .TransitionNone, animations: {
// define animations
self.myView.alpha = 0 // as an example
}) { (let finish) in
print("finish")
}
动画完成后,将调用完成处理程序。它在delay
秒(20.0)之后开始并且花费duration
秒(10.0)。也就是说,动画应该在方法调用测量30秒后完成。
(您可以在代码中放置NSLog
语句以查看事情何时发生)
我无法重现你正在经历的事情,那就是"完成"将立即打印。但是,我可以确认UIView.animateWithDuration
按预期工作 - 假设动画块实际上不是空的。