swift cocoa-touch timer delay grand-central-dispatch

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.