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

问题描述:

我有一个场景,我必须在主屏幕中触发一个计时器。当用户转到另一个屏幕或用户在应用程序内漫游时,此时在主屏幕中触发的计时器应该正在运行并且计时器标签必须更新。最后,用户回到主屏幕定时器,定时器标签应根据定时器值更新。如何实现?提前致谢。如何让计时器在应用程序本身内保持运行状态?

+1

使用单独的类,并使用计时器从那里 –

+0

您可以在后台线程做到这一点'dispatch_async()' –

+0

我我在singleton类中存储了定时器值。在singleton类中更新值,但当回到主屏幕时标签没有更新。 –

u能在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: 
     }); 
    }); 
+0

感谢您的response.Its工作,但当 - (void)viewDidLoad方法调用它不工作,但定时器fire方法执行。 –

+0

我没有得到它......你可以详细说明你的问题..如果代码工作,请接受它作为答案@UdayEega –

+0

如果我们去另一个(从家)VC和回到相同的(家)VC它的工作。但在我的情况下,我从侧面菜单调用家VC,以便 - (void)viewDidLoad的主页VC正在调用。在这种情况下标签不更新,但定时器运行。 –

另一种方法是把你的计时器的AppDelegate并创建一个方法在AppDelegate的启动/停止在AppDelegate中的Timer.create协议,并调用该委托方法在定时器选择器called.implement该协议在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) 
} 

因为有利于让一个后台不支持你不能用正常的NSTimer做到这一点。然而,使用其他方法很容易实现。 在你的AppDelegate中你有两种方法。 applicationWillResignActive和applicationDidBecomeActive。在resign方法中,您只需将当前NSDate保存到NSUserDefaults中,然后在活动方法中检索并与当前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