Как остановить таймер через несколько секунд

Здесь в методе myAPICall() я вызываю другой метод, то есть COStatusAPI() каждые 5 секунд до 90 секунд.

Здесь COStatusAPI() — вызов API. т. е. я захожу на сервер каждые 5 секунд. В ответ я получу COStatus как 1 или 0.

Если я получаю COStatus как 1, я останавливаю таймер и перехожу к другому viewController, а если я получаю COStatus как 0 в течение 90 секунд. Я останавливаю таймер и показываю предупреждение.

Но здесь моя проблема в том, что таймер не останавливается. например, если я получаю COStatus как 1, в фоновом режиме работает таймер. Итак, через 90 секунд я получаю предупреждающее сообщение.

Таким же образом до 90 секунд. Если я получаю COStatus как 0, это означает, что я показываю предупреждение. Это оповещение постоянно повторяется.

как этого добиться?. Может ли кто-нибудь помочь мне с этим

var myTimer : Timer?
var timeController : Bool = true

func myAPICall(){
    self.loadingview()
        if self.myTimer == nil {
             self.myTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.COStatusAPI), userInfo: nil, repeats: self.timeController)
             }
}

@objc func COStatusAPI(){
        if COStatus == 0{
            self.timeController = true
            let when = DispatchTime.now() + 90
            DispatchQueue.main.asyncAfter(deadline: when) {
                self.timeController = false
                if self.acceptOrRejectTimer != nil {
                    self.acceptOrRejectTimer!.invalidate()
                    self.acceptOrRejectTimer = nil
                }
                self.hideloadingView()
        //showing alert
            }
        }
        if COStatus == 1{
                self.timeController = false
                if self.acceptOrRejectTimer != nil {
                    self.acceptOrRejectTimer!.invalidate()
                    self.acceptOrRejectTimer = nil
                }
                self.hideloadingview()
        //navigating to next view controller
        }

}


person Bhanuteja    schedule 28.01.2018    source источник
comment
Если вы используете модули, вам может помочь AsyncTimer.   -  person Adrian Bobrowski    schedule 28.01.2018
comment
спасибо @AdrianBobrowski. код Вадиана работал как шарм. теперь не нужно использовать очередь отправки, асинхронный таймер и все такое   -  person Bhanuteja    schedule 28.01.2018


Ответы (1)


  • Забудьте DispatchQueue.main.asyncAfter.
  • Создайте свойство счетчика Int со значением 18.
  • В COStatusAPI() сделайте вызов API.
  • if COStatus == 1
    • invalidate() the timer and go to the next controller.
  • else
    • decrement the counter.
    • если счетчик достигает 0 invalidate() таймер и показать предупреждение.

var myTimer : Timer?
var counter = 0

func myAPICall(){
    self.loadingview()
    if self.myTimer == nil {
        counter = 18
        self.myTimer = Timer.scheduledTimer(timeInterval: 5.0,
                                            target: self,
                                            selector: #selector(COStatusAPI),
                                            userInfo: nil,
                                            repeats: true)
    }
}

@objc func COStatusAPI(_ timer: Timer) {

    // call API
    switch COStatus {
    case 0: 
        counter -= 1
        if counter == 0 {
            timer.invalidate()
            self.myTimer = nil
            //showing alert
        }
    case 1: 
        timer.invalidate()
        self.myTimer = nil
        //navigating to next view controller

    default: break
    }
}
person vadian    schedule 28.01.2018
comment
Спасибо за быстрый ответ. если вы не мой, не могли бы вы предоставить код. все еще не могу получить вывод - person Bhanuteja; 28.01.2018
comment
что такое counter = 18 здесь? 18 означает 18 секунд? - person Bhanuteja; 28.01.2018
comment
я должен остановить свой таймер через 90 секунд, и мы должны показать предупреждение? мы должны упомянуть здесь, что таймер должен работать в течение 90 секунд? - person Bhanuteja; 28.01.2018
comment
Таймер срабатывает каждые 5 секунд и 18 * 5 = 90 - person vadian; 28.01.2018