我想在某个点暂停我的应用程序。换句话说,我希望我的应用程序执行代码,但在某一点上,暂停4秒,然后继续执行其余的代码。我该怎么做呢?
我用的是Swift。
我想在某个点暂停我的应用程序。换句话说,我希望我的应用程序执行代码,但在某一点上,暂停4秒,然后继续执行其余的代码。我该怎么做呢?
我用的是Swift。
当前回答
要创建一个简单的时间延迟,您可以导入Darwin,然后使用sleep(秒)来执行延迟。不过,这只需要几秒钟的时间,所以为了更精确的测量,你可以导入Darwin并使用usleep(百万分之一秒)进行非常精确的测量。为了验证这一点,我写道:
import Darwin
print("This is one.")
sleep(1)
print("This is two.")
usleep(400000)
print("This is three.")
打印,然后等待1秒打印,然后等待0.4秒打印。一切都如预期般顺利。
其他回答
Using a dispatch_after block is in most cases better than using sleep(time) as the thread on which the sleep is performed is blocked from doing other work. when using dispatch_after the thread which is worked on does not get blocked so it can do other work in the meantime. If you are working on the main thread of your application, using sleep(time) is bad for the user experience of your app as the UI is unresponsive during that time. Dispatch after schedules the execution of a block of code instead of freezing the thread:
斯威夫特≥ 3.0
let seconds = 4.0
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
// Put your code which should be executed with a delay here
}
Swift≥5.5(异步):
func foo() async {
try await Task.sleep(nanoseconds: UInt64(seconds * Double(NSEC_PER_SEC)))
// Put your code which should be executed with a delay here
}
Swift < 3.0
let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
// Put your code which should be executed with a delay here
}
如果从UI线程调用,sleep会锁住你的程序,可以考虑使用NSTimer或分派计时器。
但是,如果你真的需要延迟当前线程:
do {
sleep(4)
}
这使用了UNIX中的睡眠函数。
如果你的代码已经在后台线程中运行,在Foundation: thread .sleep(forTimeInterval:)中使用这个方法暂停线程。
例如:
DispatchQueue.global(qos: .userInitiated).async {
// Code is running in a background thread already so it is safe to sleep
Thread.sleep(forTimeInterval: 4.0)
}
(当代码在主线程上运行时,请参阅其他答案以获得建议。)
swift 3.0中不同方法的比较
1. 睡眠
此方法没有回调。将代码直接放在这一行之后,在4秒内执行。它将阻止用户迭代UI元素,如测试按钮,直到时间结束。虽然按钮在睡眠开始时有点冻结,但其他元素,如活动指示器仍在旋转而没有冻结。在休眠期间不能再次触发此操作。
sleep(4)
print("done")//Do stuff here
2. 调度,执行和定时器
这三种方法的工作原理类似,它们都运行在后台线程上,并带有回调,只是语法和功能略有不同。
分派通常用于在后台线程上运行一些东西。它有回调函数作为函数调用的一部分
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
print("done")
})
Perform实际上是一个简化的计时器。它设置一个具有延迟的计时器,然后通过选择器触发函数。
perform(#selector(callback), with: nil, afterDelay: 4.0)
func callback() {
print("done")
}}
最后,timer还提供了重复回调的能力,这在这个例子中是没有用的
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(callback), userInfo: nil, repeats: false)
func callback() {
print("done")
}}
对于这三种方法,当你点击按钮触发它们时,UI不会冻结,你可以再次点击它。如果你再次点击按钮,另一个计时器将被设置,回调将被触发两次。
总之
这四种方法单独使用都不够好。Sleep将禁用用户交互,所以屏幕“冻结”(不是真的),并导致糟糕的用户体验。其他三个方法不会冻结屏幕,但您可以多次触发它们,大多数情况下,您希望等待,直到您得到回调才允许用户再次进行调用。
所以更好的设计是使用三种带有屏幕阻塞的异步方法之一。当用户点击按钮时,用半透明的视图覆盖整个屏幕,顶部有一个旋转的活动指示器,告诉用户按钮点击正在被处理。然后删除回调函数中的视图和指示器,告诉用户操作已正确处理,等等。
这是最简单的
delay(0.3, closure: {
// put her any code you want to fire it with delay
button.removeFromSuperview()
})