计时器不重复(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)
确保长期存在的东西引用了这个队列和这个计时器。在没有明确检查的情况下,我从此处的代码片段中得到的印象是 timer
和 queue
将在超出范围时发布。 dispatch_resume
可能导致第一个事件排队,这可能导致 queue
和 timer
存活足够长的时间来执行第一次迭代,之后它们的保留计数变为零并且它们被释放。
尝试确保它们在附近停留一段时间...
例如,从 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
}
}
我正在尝试学习如何在后台线程上分派计算并最终更新 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)
确保长期存在的东西引用了这个队列和这个计时器。在没有明确检查的情况下,我从此处的代码片段中得到的印象是 timer
和 queue
将在超出范围时发布。 dispatch_resume
可能导致第一个事件排队,这可能导致 queue
和 timer
存活足够长的时间来执行第一次迭代,之后它们的保留计数变为零并且它们被释放。
尝试确保它们在附近停留一段时间...
例如,从 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
}
}