delay swift
Use dispatch_after delay dentro de un loop (2)
¿Hay alguna forma de utilizar dispatch_after
dentro de un bucle? Tengo la función de demora a continuación:
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
Quiero ejecutarlo dentro de un ciclo como este:
while true {
self.delay(1.0) {
// Do something repeatedly
}
}
Pero parece que no puedo hacer que funcione. ¿Es posible hacer esto?
Use una fuente de despacho de tipo temporizador para llamar al cierre repetidamente. Ejemplo:
import Cocoa
import XCPlayground
func withTimerInterval(seconds: NSTimeInterval, block: dispatch_block_t) -> dispatch_source_t {
let source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue())
let interval = Int64(seconds * NSTimeInterval(NSEC_PER_SEC))
dispatch_source_set_timer(source, dispatch_time(DISPATCH_TIME_NOW, interval), UInt64(interval), 20 * NSEC_PER_MSEC)
dispatch_source_set_event_handler(source, block)
dispatch_resume(source)
return source
}
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
let timer = withTimerInterval(1) {
print("hello again")
}
Cancele el temporizador de esta manera:
dispatch_source_cancel(timer)
for (;;sleep(1)) {
print("Hello Again");
}
* Tenga en cuenta que esto bloqueará su hilo principal cada (1 segundo + 1 ciclo) durante 1 segundo. Si esto es un problema, ejecute su while for loop en un hilo separado, duerma ese NSThread en su lugar, y simplemente dispatch_get_main_queue()
dentro del ciclo for.