在Swift中使用DispatchQueue时的时间差异

时间:2018-03-18 11:41:31

标签: swift asynchronous queue grand-central-dispatch swift-playground

我有一个必须每半秒执行一次的代码,而我正在使用Xcode游乐场。我使用了这个top answer并得到了这样的代码:

for (index, item) in array.enumerated() {
            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(index), execute: {
                print("\(index) - \(df.string(from: Date()))"
                //play sound every second
            })
        }

这段代码每秒执行一次(我知道我必须将它除以2才能得到半秒但想看结果)。我使用DateFormatter来计算时间,因为我无法弄清楚为什么声音不能均匀播放。

let df = DateFormatter()
df.dateFormat = "ss.SSSS"

结果是它不会每1秒触发一次。

0 - 17.4800
1 - 18.5770 // even though it's not called exactly after 1s it's acceptable
2 - 19.6750
3 - 20.7770
4 - 21.8780
5 - 22.9760
6 - 24.0710
7 - 25.1690
8 - 26.2720
9 - 27.3640
10 - 28.4760 
11 - 28.7580 //0.3s of difference
12 - 30.4800
13 - 30.5060 // 0.1s of difference
14 - 32.4800
15 - 32.5030 // less than 0.1s of difference

1 个答案:

答案 0 :(得分:0)

这里你异步执行你的Print语句,这样你就不会在半秒(或一秒钟)后得到你的打印数据。如果你同步执行它,那么你得到的打印数据间隔为1秒。要知道更多关于调度队列跟随this链接。如果您有任何问题,请告诉我。