gpt4 book ai didi

ios - 计时器不重复(Grand Central Dispatch)

转载 作者:搜寻专家 更新时间:2023-11-01 05:51:24 24 4
gpt4 key购买 nike

我正在尝试学习如何在后台线程上分派(dispatch)计算并在之后更新 UI。当我在一个现有的谷歌地图项目中尝试这样做时,“背景”和“主要”被打印一次。不再打印,就好像计时器不再重复一样。

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

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 Single View Application 项目模板开始,在 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
}
}

关于ios - 计时器不重复(Grand Central Dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com