Вы не можете гарантировать, что ваше приложение работает в это время, каждый день.телефон может потерять весь заряд батареи, приложение может не работать ... и т. д. и т. д.
Но это просто логическая проблема ... Если вы хотите обновлять данные после определенного времени каждыйдень, вы должны просто сохранить последнее время обновления в UserDefaults, и если это время было больше, чем ваше требуемое время истечения (в данном случае 24 часа), то обновите данные и обновите последнее обновленное время.
Так что если у вас есть активный пользователь, как только истечет 24-часовая разница во времени, он обновится, или если пользовательский телефон отключится на несколько дней (по какой-либо причине), ваше приложение все равно будет знать, что ему нужнообновить данные, как только пользователь вернется в приложение.
РЕДАКТИРОВАТЬ: Добавлен пример кода
class RefreshManager: NSObject {
static let shared = RefreshManager()
private let defaults = UserDefaults.standard
private let defaultsKey = "lastRefresh"
private let calender = Calendar.current
func loadDataIfNeeded(completion: (Bool) -> Void) {
if isRefreshRequired() {
// load the data
defaults.set(Date(), forKey: defaultsKey)
completion(true)
} else {
completion(false)
}
}
private func isRefreshRequired() -> Bool {
guard let lastRefreshDate = defaults.object(forKey: defaultsKey) as? Date else {
return true
}
if let diff = calender.dateComponents([.hour], from: lastRefreshDate, to: Date()).hour, diff > 24 {
return true
} else {
return false
}
}
}
Вам не обязательно делать этот новый класс или синглтон, как у меня.Просто было проще держать все в порядке ради ответа.
Так что это сработает, если дата обновления не указана или если число часов с момента последнего больше 24, то обновит данные и обновит дату / время последнего обновления.используя завершение, он также возвращает обновленные данные или нет.
Вы также можете добавить здесь проверку, что текущий час дня равен >= 16
, если требуется.
РЕДАКТИРОВАТЬ 2: Выбираемый пользователем час
private func isRefreshRequired(userPickedHour: Int = 16) -> Bool {
guard let lastRefreshDate = defaults.object(forKey: defaultsKey) as? Date else {
return true
}
if let diff = calender.dateComponents([.hour], from: lastRefreshDate, to: Date()).hour,
let currentHour = calender.dateComponents([.hour], from: Date()).hour,
diff >= 24, userPickedHour <= currentHour {
return true
} else {
return false
}
}
В этой измененной функции isRefreshRequired вы можете передать значение часа и посмотреть, прошло ли оно не менее 24 часов с момента последнего обновления, а текущий час больше или больше выбранного часа.
Это не значит, что он будет работать, например, ровно в 16:00.он запускается, когда пользователь загружает этот экран и проходит правила (мин. 24 часа, текущий час> = выбранный пользователем час)
РЕДАКТИРОВАТЬ 3: как позвонить
class ViewController: UIViewController {
let refreshManager = RefreshManager.shared
override func viewDidLoad() {
super.viewDidLoad()
refreshManager.loadDataIfNeeded() { success in
print(success)
}
}
}
РЕДАКТИРОВАТЬ: измененная логика
if let diff = calender.dateComponents([.day], from: lastRefreshDate, to: Date()).day,
let currentHour = calender.dateComponents([.hour], from: Date()).hour,
diff >= 1, userPickedHour <= currentHour {
return true
} else {
return false
}