jiawen
jiawen

Reputation: 1208

iOS DispatchQueue.main.asyncAfter(deadline: delayTime) never dispatch if delayTime is long

var maxCumulativeTime: Int32;
maxCumulativeTime = 10 * 60 * 1000;
let dispatchTimeNSEC = Int64(Double (maxCumulativeTime) * Double(NSEC_PER_MSEC))
let delayTime = DispatchTime.now() + Double(dispatchTimeNSEC) / Double(NSEC_PER_SEC)
    DispatchQueue.main.asyncAfter(deadline: delayTime) {
              doSomething()    
    }

if delayTime is short, like 5 seconds, doSomething() will always be called. but if delayTime is long, say 10 min, doSomething() never gets called.

I keep the app running and never kills it. The phone goes to sleep during the 10 min delay time. But after I wake up the phone, doSomething is still not called.

Any thought?

Upvotes: 0

Views: 993

Answers (1)

Ashley Mills
Ashley Mills

Reputation: 53121

In Swift 3, you can simplify your calculation of deadline -

let delayTime = DispatchTime.now() + .seconds(60 * 60 * 1000)

DispatchQueue.main.asyncAfter(deadline: delayTime) {
          doSomething()    
}

Not necessarily the answer you're looking for, but may help you get closer to a solution

If you're passed a time in milliseconds…

let delayTime = DispatchTime.now() + .milliseconds(timeValue)

Upvotes: 1

Related Questions