📜  延迟代码执行 swift 5 - Swift (1)

📅  最后修改于: 2023-12-03 15:39:29.025000             🧑  作者: Mango

延迟代码执行 Swift 5 - Swift

在开发 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

另一种常用的延迟执行方法是使用 Timer 类。它可以在指定的时间间隔后执行一段代码。例如,下面的代码会在 2 秒钟后执行 print("Hello, world")

_ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { timer in
    print("Hello, world")
}

这里的 withTimeInterval: 2.0 指定了 2 秒钟的时间间隔,repeats: false 表示不重复执行。然后我们传入要执行的代码块。

使用 Runloop

另一种延迟执行方式是使用 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 则具有更强的灵活性。