📅  最后修改于: 2023-12-03 15:39:29.025000             🧑  作者: Mango
在开发 iOS 应用时,经常需要延迟执行某段代码或者在指定时间后执行某段代码,这时候就可以使用 Swift 中提供的延迟执行方法。
dispatch_after
dispatch_after
函数可以在指定时间后将代码加入到队列中,等到队列空闲时执行。例如,下面的代码会延迟 2 秒钟执行 print("Hello, world")
:
let delayTime = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: delayTime) {
print("Hello, world")
}
注意,delayTime
的类型是 DispatchTime
,它是一个 struct
,代表了一个时间点,由当前时间和一个时间间隔组成。在这里,我们使用 DispatchTime.now()
来获取当前时间,然后加上 2.0
秒钟的时间间隔,得到延迟 2 秒钟后的时间点。然后,我们将这个时间点作为参数传给了 asyncAfter
方法,再传入要执行的代码块。
另一种常用的延迟执行方法是使用 Timer
类。它可以在指定的时间间隔后执行一段代码。例如,下面的代码会在 2 秒钟后执行 print("Hello, world")
:
_ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { timer in
print("Hello, world")
}
这里的 withTimeInterval: 2.0
指定了 2 秒钟的时间间隔,repeats: false
表示不重复执行。然后我们传入要执行的代码块。
另一种延迟执行方式是使用 Runloop。和 dispatch_after
类似,我们也可以使用 CFRunLoopTimer
在指定时间后将代码加入到 Runloop 中执行。例如,下面的代码会延迟 2 秒钟执行 print("Hello, world")
:
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + 2.0, 0, 0, 0) { timer in
print("Hello, world")
CFRunLoopStop(CFRunLoopGetCurrent())
}
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, CFRunLoopMode.commonModes)
CFRunLoopRun()
这里我们首先创建了一个 CFRunLoopTimer
,然后设置它的参数,包括指定时间、重复次数等。然后我们将要执行的代码块传入了 timer 的回调函数中。最后,我们将 timer 加入到当前 Runloop 中,然后启动 Runloop。执行完回调函数后,我们用 CFRunLoopStop
停止了 Runloop。
以上三种方式都可以用来延迟执行代码。它们的适用场景不一样,可以根据具体需求选择使用哪一种方法。总体而言,使用 dispatch_after
更为简单实用,而 Timer
和 Runloop 则具有更强的灵活性。