Search code examples
iosswiftgrand-central-dispatchdispatch-queue

DispatchQueue doesn't behave like serial queue


By using following code, I am expecting that every time the func is caled, minimum time between executions will be 3-4 seconds.

But: when I call the writeData() 4 times in row, I see that async block executed without waiting for previous call finished.

func writeData(){
    DispatchQueue(label: "be.io").asyncAfter(deadline: .now() + 1) {
        print("START :\(Int64((Date().timeIntervalSince1970 * 1000.0).rounded()))")
        Thread.sleep(forTimeInterval: 3)
    }
}
...
writeData()
writeData()
writeData()
writeData()

Expected output should be something like:

START :1611250630000
START :1611250634000
START :1611250638000
START :1611250642000

but on execution i get same timestamp (~1 millisecond difference) for all 4 calls.

START :1611250630000
START :1611250630000
START :1611250630000
START :1611250630000

What i am doing wrong?

P.S I tried async without delay, no luck.


Solution

  • DispatchQueue(label: "be.io") will create a new instance every time you call it

    To get as you expect make it an instance var like

    let mySerialQueue = DispatchQueue(label: "be.io")