2016-07-16 112 views
9

Ha qualcosa a che fare con DispatchSourceTimer, ma non riesco ad andare da nessuna parte.Come si usa Swift 3 scheduleRepeating?

Questo mi dà un errore di "riferimento ambiguo":

DispatchSourceTimer.scheduleRepeating(deadline:.now(), interval:.milliseconds(delay), leeway:.milliseconds(1)) 

La mia soluzione

Il problema era di fare con il tipo di confusione. Grazie Matt per avermi indicato nella giusta direzione. Ecco il mio risultato completo.

private var queueNo = 0 
@discardableResult func repeater(_ delay:Int, _ closure:(()->())) -> (()->()) { 
    let queue = DispatchQueue(label: "repeater\(queueNo)", attributes: []) 
    queueNo += 1 
    let timer = DispatchSource.makeTimerSource(flags: [], queue: queue) 
    timer.scheduleRepeating(deadline: .now() + .milliseconds(delay), interval: .milliseconds(delay), leeway: .milliseconds(1)) 
    timer.setEventHandler { 
     DispatchQueue.main.async(execute: closure) 
    } 
    timer.resume() 
    return { 
     timer.cancel() 
    } 
} 
+0

per antipasto, ho davvero stava chiamando la funzione statica quando ho bisogno di un istanziato 'DispatchSource.timer (...)'. in secondo luogo il mio "ritardo" era un Int64 che causava problemi di tipo. –

+0

Sembra che questo sia cambiato in Beta 4 –

+0

Hm. Ho bisogno di esaminarlo. –

risposta

0

Prova questa

override func viewDidLoad() { 
    super.viewDidLoad() 
    //Swift 3 
    timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.update), userInfo: nil, repeats: true); 
} 

func update() { 
    // Do Something 
} 
+0

Questo non risponde alla domanda. I timer NSTimer e GCD sono cose diverse. I timer GCD offrono molto più controllo sul modo in cui vengono eseguiti, possono essere ordinati per priorità, sono più compatibili con la batteria ... – Moose