mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2024-12-23 08:09:41 +01:00
82 lines
1.7 KiB
Swift
82 lines
1.7 KiB
Swift
//
|
|
// RefreshTimer.swift
|
|
// NetNewsWire
|
|
//
|
|
// Created by Maurice Parker on 4/23/19.
|
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Account
|
|
|
|
@MainActor final class AccountRefreshTimer {
|
|
|
|
var shuttingDown = false
|
|
|
|
private var internalTimer: Timer?
|
|
private var lastTimedRefresh: Date?
|
|
private let launchTime = Date()
|
|
|
|
func fireOldTimer() {
|
|
if let timer = internalTimer {
|
|
if timer.fireDate < Date() {
|
|
if AppDefaults.shared.refreshInterval != .manually {
|
|
timedRefresh(nil)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func invalidate() {
|
|
guard let timer = internalTimer else {
|
|
return
|
|
}
|
|
if timer.isValid {
|
|
timer.invalidate()
|
|
}
|
|
internalTimer = nil
|
|
}
|
|
|
|
func update() {
|
|
guard !shuttingDown else {
|
|
return
|
|
}
|
|
|
|
let refreshInterval = AppDefaults.shared.refreshInterval
|
|
if refreshInterval == .manually {
|
|
invalidate()
|
|
return
|
|
}
|
|
let lastRefreshDate = lastTimedRefresh ?? launchTime
|
|
let secondsToAdd = refreshInterval.inSeconds()
|
|
var nextRefreshTime = lastRefreshDate.addingTimeInterval(secondsToAdd)
|
|
if nextRefreshTime < Date() {
|
|
nextRefreshTime = Date().addingTimeInterval(secondsToAdd)
|
|
}
|
|
if let currentNextFireDate = internalTimer?.fireDate, currentNextFireDate == nextRefreshTime {
|
|
return
|
|
}
|
|
|
|
invalidate()
|
|
let timer = Timer(fireAt: nextRefreshTime, interval: 0, target: self, selector: #selector(timedRefresh(_:)), userInfo: nil, repeats: false)
|
|
RunLoop.main.add(timer, forMode: .common)
|
|
internalTimer = timer
|
|
|
|
}
|
|
|
|
@objc func timedRefresh(_ sender: Timer?) {
|
|
|
|
guard !shuttingDown else {
|
|
return
|
|
}
|
|
|
|
lastTimedRefresh = Date()
|
|
update()
|
|
|
|
Task {
|
|
await AccountManager.shared.refreshAll()
|
|
}
|
|
}
|
|
|
|
}
|