swift - डिस्पैचसोर्सटाइमर और स्विफ्ट 3.0



grand-central-dispatch swift3 (1)

सुनिश्चित करें कि टाइमर गुंजाइश से बाहर नहीं आता है। NSTimer विपरीत, आपको अपने जीसीडी टाइमर के लिए एक मजबूत संदर्भ बनाए रखने की आवश्यकता है, उदाहरण के लिए:

var timer: DispatchSourceTimer?

private func startTimer() {
    let queue = DispatchQueue(label: "com.firm.app.timer", attributes: .concurrent)

    timer?.cancel()        // cancel previous timer if any

    timer = DispatchSource.makeTimerSource(queue: queue)

    timer?.schedule(deadline: .now(), repeating: .seconds(5), leeway: .milliseconds(100))

    // or, in Swift 3:
    //
    // timer?.scheduleRepeating(deadline: .now(), interval: .seconds(5), leeway: .seconds(1))

    timer?.setEventHandler { [weak self] in // `[weak self]` only needed if you reference `self` in this closure and you want to prevent strong reference cycle
        print(Date())
    }

    timer?.resume()
}

private func stopTimer() {
    timer?.cancel()
    timer = nil
}

मैं यह नहीं समझ सकता कि स्विफ्ट 3.0 में प्रेषण टाइमर का काम बार-बार कैसे किया जाए। मेरा कोड:

let queue = DispatchQueue(label: "com.firm.app.timer",
                          attributes: DispatchQueue.Attributes.concurrent)
let timer = DispatchSource.makeTimerSource(flags: DispatchSource.TimerFlags(rawValue: UInt(0)),
                                           queue: queue)

timer.scheduleRepeating(deadline: DispatchTime.now(),
                        interval: .seconds(5),
                        leeway: .seconds(1)
)

timer.setEventHandler(handler: {
     //a bunch of code here
})

timer.resume()

टाइमर सिर्फ एक बार आग लगाता है और खुद को दोहराता नहीं है जैसा कि होना चाहिए। मैं इसे कैसे ठीक करूं?





dispatch