Аннулирование NSTimer не работает должным образом - PullRequest
0 голосов
/ 05 июля 2018

Я использую NSTimer в моем проекте:

var clickTimer: Timer?

override func mouseDown(with event: NSEvent) {
    clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)
}

и позже я аннулирую его в

override func mouseUp(with event: NSEvent) {
    if let timer = self.clickTimer {
        timer.invalidate()
    }
}

код внутри mouseUp работает, но метод таймера close все еще работает в течение 2 секунд. Почему недействительность не работает?

Ответы [ 6 ]

0 голосов
/ 05 июля 2018

попробуйте это -

if (self.clickTimer == nil) { 
self.clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false) 
}
0 голосов
/ 05 июля 2018

Попробуйте это

private var clickTimer: NSTimer?

func functionname() {
        guard clickTimer == nil else { return }
        clickTimer = NSTimer.scheduledTimerWithTimeInterval(15, target: self, selector: "fetchWallPosts", userInfo: nil, repeats: true)
    }

или

self. clickTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(yourmethod)), userInfo: nil, repeats: true)
0 голосов
/ 05 июля 2018

Проблема возникает, когда mouseDown(with:) вызывается несколько раз, ваш оригинальный таймер будет заменен, что означает, что у вас нет ссылки для его аннулирования.

var clickTimer: Timer?

override func mouseDown(with event: NSEvent) {
    clickTimer?.invalidate()
    clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)
}

override func mouseUp(with event: NSEvent) {
    clickTimer?.invalidate()
}
0 голосов
/ 05 июля 2018

Теперь я вижу. Вы не хотите переобъявлять свой clickTimer, поэтому вы хотите

if (self.clickTimer == nil) { 
    self.clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false) 
}


Только мысль, что вы повторно инициализируете clicktimer несколько раз, предыдущий был успешно аннулирован, но вы случайно изменили метку нового таймера .. хм ..

Я также предлагаю добавить self.clickTimer = nil после timer.invalidate(), чтобы быть в безопасности

0 голосов
/ 05 июля 2018

Попробуйте этот код, сначала аннулируйте его, а затем удалите ссылку.

override func mouseUp(with event: NSEvent) {
    self.clickTimer?.invalidate()
    self.clickTimer = nil
}
0 голосов
/ 05 июля 2018

вы сделали недействительным экземпляр self.clickTimer, вы должны сделать недействительным self.clickTimer

override func mouseUp(with event: NSEvent) {
  if let timer = self.clickTimer {
      self.clickTimer.invalidate()
  }
}

Обновление

я вижу, вы не запускали clickTimer! сначала, если вы хотите сделать это, вы должны запустить эту переменную -> clickTimer.fire ()

тогда, когда вы хотели, вы должны сделать недействительным,

'Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)

автоматически запускается, когда вы хотите объявить clickTimer, но это не то, что вы хотите аннулировать !!!

...