簡體   English   中英

Deinit / Invalidate Timer

[英]Deinit / Invalidate Timer

我試圖在用戶按下后退按鈕時取消/使Timer無效,但在他推到下一個 ViewController 時卻沒有。

var timer = Timer()
                timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timePrinter), userInfo: nil, repeats: true)
                timer.fire()

override func viewWillDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    if self.isMovingFromParentViewController{
        timer.invalidate()
    }
}

當用戶按下后退按鈕時它不起作用。

當您將排定計時器與“目標/選擇器”一起使用時,它將保留其目標。 更具體地說,Runloop保留計划的計時器,這些計時器又保留其目標。

我使用此版本,該版本不保留自身:

Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self] _ in
    self?.doSomethingRegularly()
})

而且您仍然需要在deinit中使上述計時器無效,否則您將泄漏計時器(但不會泄漏您的班級)。

不要將計時器失效放在viewWillDisappear(_:) 創建一個deinit方法並將其放在那里。 當您按下返回按鈕時,應釋放當前的視圖控制器,並且將觸發deinit方法。

deinit {
  timer.invalidate()
}

通過在viewDidAppearviewDidDisappear添加Timer()來修復它,我正在執行timer.invalidate()

override func viewDidAppear(_ animated: Bool) {
    if setTimer == true{
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timePrinter), userInfo: nil, repeats: true)
        timer.fire()
    }
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
        timer.invalidate()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM