如何在应用程序本身内保持计时器处于运行状态?

时间:2017-04-06 06:21:57

标签: ios objective-c nstimer

我有一个场景,我必须在主屏幕上启动一个计时器。当用户进入另一个屏幕或用户在应用程序内漫游时,主屏幕中触发的计时器应该正在运行并且计时器标签必须更新。最后当用户回到主屏幕定时器和定时器标签应根据定时器值更新。如何实现这一点?提前谢谢。

3 个答案:

答案 0 :(得分:0)

你可以在dispatch_queue_t队列中运行:

  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            // perform on main
           //your method for running timer:
        });
    });

答案 1 :(得分:0)

另一种方法是将您的计时器放在AppDelegate中,并在AppDelegate中创建一个方法来启动/停止AppDelegate中的Timer.create协议,并在调用计时器选择器时调用该委托方法。在HomeVC中实现该协议

 var Timer = NSTimer()
 var workTime = 0
 func startTimer()
 {
    self.Timer =  NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(self.countDownValue(_:)), userInfo: nil, repeats: true)

 }
 func countDownValue(dt: NSTimer)
 {
        self.workTime += 1
        delegate?.updateValueofLabel(self.workTime)
 }

答案 2 :(得分:0)

由于不支持后台处理,因此无法使用普通的NSTimer执行此操作。然而,使用另一种方法可以非常容易地实现。 在AppDelegate中,您有两种方法。 applicationWillResignActive和applicationDidBecomeActive。在resign方法中,您只需要将当前的NSDate持久保存到NSUserDefaults和active方法中,检索它并将其与当前的NSDate进行比较,以获得应用程序处于非活动状态的时间。

代码示例:

func applicationWillResignActive(application: UIApplication) {
    let date = NSDate()
    NSUserDefaults.standardUserDefaults().setObject(date, forKey: "DateTimer")
}

func applicationDidBecomeActive(application: UIApplication) {
    if let persistedDate = NSUserDefaults.standardUserDefaults().objectForKey("DateTimer") as? NSDate {
        let difference = NSCalendar.currentCalendar().components([.Second], fromDate: persistedDate, toDate: NSDate(), options: [])
        let differenceSeconds = difference.second
    }
}

代码从此处获取:Click Here