【问题标题】:How to keep timer in running state within the app itself?如何在应用程序本身内保持计时器处于运行状态?
【发布时间】:2017-04-06 06:21:57
【问题描述】:

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

【问题讨论】:

  • 使用单例类并从那里使用计时器
  • 你可以在后台线程dispatch_async()中做到这一点
  • 我将计时器值存储在单例类中。单例类中的值更新,但返回主屏幕时标签未更新。

标签: ios objective-c nstimer


【解决方案1】:

你可以在 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:
        });
    });

【讨论】:

  • 感谢您的回复。它可以工作,但是当 - (void)viewDidLoad 方法调用它不工作时。但是计时器触发方法正在执行。
  • 我没明白...你能详细说明你的问题吗..如果代码有效,请接受它作为答案@UdayEega
  • 如果我们去另一个(从家)VC并回到同一个(家)VC它的工作。但在我的情况下,我从侧边菜单调用Home VC,这样-(void)viewDidLoad Home VC 正在调用。在这种情况下,标签不会更新。但计时器正在运行。
  • 你需要在视图中更新你的标签文本 -(void)viewWillAppear:(BOOL)animated{ };因为你的 VC 已经加载了。
【解决方案2】:

另一种方法是将您的计时器放入 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)
 }

【讨论】:

    【解决方案3】:

    您不能使用普通的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      相关资源
      最近更新 更多