如何在几秒钟后停止计时器

时间:2018-01-28 11:46:37

标签: ios swift timer nstimer dispatch-queue

myAPICall()方法中,我每隔5秒钟调用另一种方法I.e.,COStatusAPI(),最多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
        }

}

1 个答案:

答案 0 :(得分:1)

  • 忘记DispatchQueue.main.asyncAfter
  • 创建值为18的Int计数器属性。
  • COStatusAPI()进行API调用。
  • 如果COStatus == 1
    • invalidate()计时器并转到下一个控制器。
  • 否则
    • 递减柜台。
    • 如果计数器达到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
    }
}