我看了很多文章,没有一个答案是正确的。我知道这些方法有效,但在for循环中却没有。如何创建倒计时功能 - 我可以在其间打印一个延迟一秒的数组。
let array = [9, 8, 7, 6, 5, 4, 3, 2, 1]
我试过了:
for n in array {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
print(n)
}
}
并在1秒后打印所有数字。所以我尝试了这个:
override func viewDidLoad() {
super.viewDidLoad()
let timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: (#selector(printer)), userInfo: nil, repeats: true)
}
@objc func printer() {
for n in array {
print(n)
}
}
结果相同。我想这些都是好方法,但有些不对劲。
答案 0 :(得分:1)
为计时器
创建一个计数器变量和另一个变量var counter = 0
var timer : Timer?
在viewDidLoad
中创建计时器
override func viewDidLoad() {
super.viewDidLoad()
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(printer), userInfo: nil, repeats: true)
}
在action方法中增加counter
变量,并在达到数组中的项目数时使计时器失效。
@objc func printer() {
print(array[counter])
counter += 1
if counter == array.count {
timer?.invalidate()
timer = nil
}
}
另一种方式是DispatchSourceTimer
,它避免了@objc
运行时
var timer : DispatchSourceTimer?
let interval : DispatchTime = .now() + .seconds(1)
timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
timer!.schedule(deadline:interval, repeating: 1)
var index = 0
timer!.setEventHandler {
// DispatchQueue.main.async {
print(array[index])
}
index += 1
if index == array.count {
timer!.cancel()
timer = nil
}
}
timer!.resume()
答案 1 :(得分:1)
For循环几乎同时发送所有调度,所以所有这些调度都具有相同的等待时间,你可以像这样依赖它
let array = [9, 8, 7, 6, 5, 4, 3, 2, 1]
for i in 0...array.count-1 {
DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) ) {
print(array[i])
}
}
答案 2 :(得分:0)
试试此代码
let array = [9, 8, 7, 6, 5, 4, 3, 2, 1]
DispatchQueue.global().async {
for n in array {
sleep(1)
print(n)
}
}
使用时DispatchQueue
不正确,因为等待然后打印所有