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