延迟循环(倒计时功能)

时间:2018-04-24 09:02:47

标签: ios swift for-loop delay

我看了很多文章,没有一个答案是正确的。我知道这些方法有效,但在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)
        }
    }

结果相同。我想这些都是好方法,但有些不对劲。

3 个答案:

答案 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不正确,因为等待然后打印所有