iOS中的定时器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中的定时器相关的知识,希望对你有一定的参考价值。

参考技术A

创建方式:

需要添通过 addTimer:forMode: 加到当前线程的runloop

如果只是执行延时操作,可以用:

以上的所有方法创建的定时器,如果在子线程中运行是需要开启runloop的

影响NSTimer的原因:

计时器对象,与屏幕的刷新率同步。

ios 设备的屏幕刷新频率是固定的,其精度相当准确,一般用于做 UI 界面的不停重绘

GCD中的 dispatch_source 常见的场景就是定时器功能, dispatch_source_t 系统级的源事件,由系统自动触发,高精度

void dispatch_source_set_timer(dispatch_source_t source,dispatch_time_t start,uint64_t interval,uint64_t leeway);

参数1:source 创建的定时器timer

参数2:DISPATCH_TIME_NOW

DISPATCH_SOURCE_TYPE_TIMER系统会使用默认时钟来进行计时,当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。

dispatch_walltime(NULL,0)可以让计时器按照真实时间间隔进行计时。

参数3:间隔时间

参数4:容错,如果设置为1秒,系统可能会在任务时间到达前1秒或后1秒执行

创建好的定时器,需要手动开启:

等到指定的时间通过异步的方式将提其提交到指定的队列中执行

dispatch_time 第一个参数:dispatch_time_t

DISPATCH_TIME_NOW: 0

DISPATCH_TIME_FOREVER: 无穷大

这里0.36代表 0.36秒之后执行任务

如何使用倒数计时器停止游戏 - iOS [SWIFT] -

【中文标题】如何使用倒数计时器停止游戏 - iOS [SWIFT] -【英文标题】:How to use a countdown timer to stop a game - iOS [SWIFT] - 【发布时间】:2014-09-20 14:58:45 【问题描述】:

我的游戏应该在 60 秒后停止。但是我的计时器代码没有任何反应。

var timer = NSTimer()
var counter:Int = 60
var labelCounter:SKLabelNode = SKLabelNode()

这是我的 GameScene 类中的代码:

func startTimer()

    timer = NSTimer.scheduledTimerWithTimeInterval(1.0
        , target: self, selector: Selector("updateTimer:"), userInfo: nil, repeats: true)


func updateTimer(dt:NSTimer)

    counter--

    if counter == 0 
        timer.invalidate()
        removeCountDownTimerView()
     else
        labelCounter.text = "\(counter)"
    


func removeCountDownTimerView()

    scene.view.paused = true

感谢您的洞察力:-)

【问题讨论】:

您是否尝试过暂停场景而不是视图:scene.paused = true 【参考方案1】:

试试这样的......

override func viewDidLoad() 
    super.viewDidLoad()
    //calling the wait function 
    self.callForWait()


func callForWait()
    //setting the delay time 60secs.
    let delay = 60 * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue())  
        //call the method which have the steps after delay.
        self.stepsAfterDelay()
    



func stepsAfterDelay()
   //your code after delay takes place here...

【讨论】:

【参考方案2】:

我在游戏中遇到过这个。希望对您有所帮助:

import UIKit

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        startGame()
    

    var startTime = NSTimeInterval()
    var timer = NSTimer()
    var gameTime:Double = 10


    func startGame() 

        let aSelector : Selector = "updateTime"
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: aSelector, userInfo: nil, repeats: true)
        startTime = NSDate.timeIntervalSinceReferenceDate()

    

    func updateTime() 
        var currentTime = NSDate.timeIntervalSinceReferenceDate()
        var elapsedTime = currentTime - startTime
        var seconds = gameTime-elapsedTime
        if seconds > 0 
            elapsedTime -= NSTimeInterval(seconds)
            println("\(Int(seconds))")
         else 
            timer.invalidate()
        
    


【讨论】:

漂亮!史蒂夫只有一件事,有任何目的 elapsedTime -= NSTimeInterval(seconds) 吗?

以上是关于iOS中的定时器的主要内容,如果未能解决你的问题,请参考以下文章

Ios开发中的定时动画

当应用程序进入和退出后台时更新ios中的计时器

iOS开发简单的实现后台任务(诸如后台播放音乐,定时器,后台定位等)

iOS Instruments:计时器的时间与调用树中的运行时间总和不匹配

在 iOS 8 中在计时器/定期更新背景中的位置

Flutter中的Timer