thread - swift延後執行




在循環內使用dispatch_after延遲 (2)

有沒有辦法在循環中使用dispatch_after ? 我有以下的延遲功能:

func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

我想在這樣一個循環內執行它:

while true {
    self.delay(1.0) {
        // Do something repeatedly
    }
}

但我似乎無法得到它的工作。 是否有可能做到這一點?


使用定時器類型的調度源重複調用閉包。 例:

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")
}

取消這個定時器:

dispatch_source_cancel(timer)

for (;;sleep(1)) {
    print("Hello Again");
}

*注意,這將鎖定您的主線程每(1秒+1循環)1秒。 如果這是一個問題,請在單獨的線程中運行while循環,而不是使用NSThread,而只需在for循環中dispatch_get_main_queue()







grand-central-dispatch