Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
205 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 Reply

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...