计时器不重复(Grand Central Dispatch)

Timer Not Repeating (Grand Central Dispatch)

我正在尝试学习如何在后台线程上分派计算并最终更新 UI。当我在使用 Google 地图的现有项目中尝试此操作时,会打印一次 "background" 后跟 "main"。不再打印,就好像计时器不再重复一样。

此外,当我创建一个空白应用程序并添加此代码时,根本不会打印任何内容。

let queue = dispatch_queue_create("myTimer", nil);
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer) {
    println("background")
    dispatch_async(dispatch_get_main_queue(), { println("main") })
}

dispatch_resume(timer)

确保长期存在的东西引用了这个队列和这个计时器。在没有明确检查的情况下,我从此处的代码片段中得到的印象是 timerqueue 将在超出范围时发布。 dispatch_resume 可能导致第一个事件排队,这可能导致 queuetimer 存活足够长的时间来执行第一次迭代,之后它们的保留计数变为零并且它们被释放。

尝试确保它们在附近停留一段时间...

例如,从 Xcode 中的 iOS 单视图应用程序项目模板开始,并在 AppDelegate.swift 中使用以下内容,计时器重复得很好:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var queue: dispatch_queue_t?
    var timer: dispatch_source_t?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        queue = dispatch_queue_create("myTimer", nil);
        timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);

        dispatch_source_set_event_handler(timer) {
            println("background")
            dispatch_async(dispatch_get_main_queue(), { println("main") })
        }

        dispatch_resume(timer)

        return true
    }
}