从最小化状态返回后调用计时器 iOS

timer gets called after coming back from minimized state iOS

我在获取当前位置后构建了一个实时时钟,然后根据 api 响应显示当前时间 - 我正在使用这些功能来显示当前时间。

func getCurrentTime() {
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.currentTimeAfterFetchedTime), userInfo: nil, repeats: true)
}

@objc func currentTimeAfterFetchedTime(currentTime : Int) {
    print("Timer Function gets Called \(Date())")
    let formatter = DateFormatter()
    formatter.dateFormat = "MMM d, h:mm:ss a"
    DispatchQueue.main.async {
        self.presentDayDateNTime.text = formatter.string(from: Date(timeIntervalSince1970: TimeInterval(self.dynamicCurrentDateNTime)))
        self.dynamicCurrentDateNTime += 1
    }
}

现在我想重新获取 api 并在用户在最小化状态后返回时实时显示。所以我添加了这个通知观察器来检查应用程序是否从最小化状态返回 -

NotificationCenter.default.addObserver(self, selector: #selector(applicationComesInTheForeground), name: UIApplication.willEnterForegroundNotification, object: nil)

在我的 viewDidLoad() 中,还定义了这个来获取位置并再次调用 api-

@objc func applicationComesInTheForeground() {
    print("Called")
    self.spinner.startAnimating()
    fetchCurrentLocation()
}

我的应用程序在第一次启动时运行良好,但当它从最小化状态返回时,currentTimeAfterFetchedTime 在几秒钟内被调用两倍,我的时钟变得足够快以在 1 分钟内计数只需 30 秒。

我正在从 api call-

的完成处理程序中调用 currentTimeAfterFetchedTime 函数
DispatchQueue.main.async {
            print("In Dispathch",self.currentDayData)
            
            // MARK: - Dynamic time representation afetr fetching data from API
            self.dynamicCurrentDateNTime = self.currentDayData.dt
            self.getCurrentTime()
}

所以,我的问题是为什么我的定时器函数在几秒钟内被调用两次?

您应该在 getCurrentTime() 中重置旧计时器,然后再启动它。

timer.invalidate()

添加以下观察器并在应用进入后台或非活动状态时使计时器失效。

NotificationCenter.default.addObserver(self, selector: #selector(applicationWillBecomeInactive), name: UIApplication.willResignActiveNotification, object: nil)
@objc func applicationWillBecomeInactive() {
    print("application inactive")
    timer.invalidate()
}

只要应用程序激活,您就可以启动计时器(由您完成)