几秒钟后如何停止计时器

Posted

技术标签:

【中文标题】几秒钟后如何停止计时器【英文标题】:How to stop Timer after few seconds 【发布时间】:2018-01-28 11:46:36 【问题描述】:

这里在myAPICall() 方法中调用另一个方法,即COStatusAPI(),每 5 秒最多 90 秒。

这里的COStatusAPI() 是一个API 调用。即,我每 5 秒访问一次服务器。作为回应,我会得到 COStatus 为 1 或 0

如果我得到 COStatus 为 1,我将停止计时器并导航到另一个 viewController 和 如果我将 COStatus 设为 0 90 秒。我正在停止计时器并显示警报。

但这里我的问题是计时器没有停止。比如,如果我得到 COStatus 为 1,则后台计时器正在运行。因此,在 90 秒后收到警报消息。

以同样的方式直到 90 秒。如果我得到 COStatus as 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
        

【问题讨论】:

如果您使用 pod,那么 AsyncTimer 可能会对您有所帮助 谢谢@AdrianBobrowski。 vadian 的代码就像魅力一样。现在不需要使用dispatchqueue、异步定时器等等 【参考方案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
    

【讨论】:

感谢您的快速响应。如果你不是我的,你能提供代码吗?仍然无法获得输出 这里的 counter = 18 是什么? 18 表示 18 秒吗? 我必须在 90 秒后停止计时器并且我们必须显示警报?我们是否需要在这里提到计时器应该运行 90 秒? 定时器每 5 秒触发一次,18 * 5 = 90

以上是关于几秒钟后如何停止计时器的主要内容,如果未能解决你的问题,请参考以下文章

如何停止 System.Threading.Timer,然后更改其参数并再次运行? [复制]

clearInterval 按钮不停止 setInterval 倒计时

我只需要几小时、几分钟和几秒钟来倒计时

VBA Macro On Timer样式每隔几秒钟运行代码,即120秒

如何等待多个 C# 事件?

当应用程序进入和退出后台时更新ios中的计时器