Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
213 views
in Technique[技术] by (71.8m points)

ios - 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.

question from:https://stackoverflow.com/questions/65832975/dispatchqueue-doesnt-behave-like-serial-queue

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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") 

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...