【问题标题】:Invalidating NSTimer使 NSTimer 无效
【发布时间】:2016-08-08 06:55:16
【问题描述】:

我的应用中有 4 个 NSTimers 对象,它们每隔几秒就向一个休息 URL 发出请求。

单击特定的button 我想停止计时器以使其停止轮询,单击另一个button 我想恢复轮询。

我已经为所有计时器尝试了invalidate,但不起作用。

注意:所有计时器都在不同的类中,我正在尝试使另一个类中的计时器无效 任何帮助将不胜感激,谢谢。

class NotificationViewController:UIViewController {
    var timer:NSTimer?
    getEvents(){
    if((timer == nil)) {
        timer = NSTimer.scheduledTimerWithTimeInterval(20.0, target: self, selector: Selector("getEvents"), userInfo: nil, repeats: true)
    }
  }
}

在另一个类中,我通过单击按钮来执行此操作

class Menu:UIViewController {

    @IBAction func buttonTapped(sender: UIButton) {
        self.notify.timer?.invalidate()
        self.notify.timer = nil
    }
}

【问题讨论】:

  • 把你试过的代码放上去。
  • 编辑问题
  • self.notify 对象与您用于初始化 NSTimer 的对象相同?
  • 没有 self.notify 是另一个类 NotificationViewController

标签: ios swift nstimer


【解决方案1】:

您似乎丢失了对计时器的原始引用。 一种可能的evil 解决方案是在整个应用程序中保留引用。您可以使用struct 做到这一点 :

struct Timers {
   static var firstTimer = NSTimer()
   static var secondTimer = NSTimer()
   static var thirdTimer = NSTimer()
   static var fourthTimer = NSTimer()
}

这样你就可以在程序的任何地方访问计时器:

Timers.firstTimer.invalidate()

【讨论】:

  • 不,计时器仍在运行
  • 为什么需要静力学???为什么你需要从程序中的任何地方访问计时器???这和定时器的释放有什么关系???这不是解决方案!而且在大多数情况下它是反模式
  • 我想从不同的 ViewController 类中停止计时器,所以我需要在那个 ViewController 中访问它
【解决方案2】:

尝试创建一个单独的NotificationTimer 类,并像这样在整个项目中使用它的共享对象。

class NotificationTimer: NSObject {

    var timer1: NSTimer?
    var timer2: NSTimer?
    var timer3: NSTimer?
    var timer4: NSTimer?

    static let sharedManager = NotificationTimer()

    func getEvents(){
        print("Fired")
        if (timer1 == nil){
            timer1 = NSTimer.scheduledTimerWithTimeInterval(20.0, target: self, selector: Selector("methodYouWantToCall"), userInfo: nil, repeats: true)
        }
    }    
}

现在像这样在任何ViewController 中调用这个timer1 对象。

let notificationTimer = NotificationTimer.sharedManager
notificationTimer.timer1?.invalidate()

或者像这样调用那个方法

NotificationTimer.sharedManager().getEvents()

【讨论】:

  • 定时器只触发一次。 20 秒后不再重复
  • 您是否更改了选择器?因为getEvents和初始化定时器是同一个。
  • 不,我没有改变选择器,它是一样的。该方法只调用一次,20秒后不再执行
  • 我在方法中添加了打印语句,每 20 秒检查一次是否打印。
  • 我的错。我为 Timer 创建了另一个没有触发的类。这行得通。非常感谢!
【解决方案3】:
  1. 取消定时器:

    if (timer.isValid()) { timer.invalidate() }

    计时器 = 无;

  2. 只需调试您的应用程序并检查您没有释放计时器的位置。

  3. 请记住,计时器会保留它的目标,因此如果您想释放目标,您也需要释放计时器,或者您可以编写自己的计时器,并参考目标的周数。

【讨论】:

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