#swift
Вопрос:
Я хочу отследить, когда пользователь в последний раз обновлял api, поэтому я решил сделать это так:
@AppStorage("lastTimeUserRefreshedApi") var lastTimeUserRefreshedApi: Date = Date()
func canUserRefreshAPI() -> Bool {
let readyToBeRefreshed: Date = lastTimeUserRefreshedApi.addingTimeInterval(5) // in seconds
let currentTime: Date = Date()
var canUserRefresh: Bool = false
if(currentTime > readyToBeRefreshed) {
canUserRefresh = true
lastTimeUserRefreshedApi = lastTimeUserRefreshedApi.addingTimeInterval(5)
} else {
canUserRefresh = false
}
return canUserRefresh
}
Проблема в том, что он всегда возвращается истинным, но почему? Также есть ли более простой способ сделать это?
Спасибо
Редактировать:
Это расширение, которое я использую, чтобы иметь возможность хранить дату в @AppStorage:
extension Date: RawRepresentable {
public var rawValue: String {
self.timeIntervalSinceReferenceDate.description
}
public init?(rawValue: String) {
self = Date(timeIntervalSinceReferenceDate: Double(rawValue) ?? 0.0)
}
}
Комментарии:
1. Что говорит вам отладчик, когда вы проверяете значения
currentTime
иreadyToBeRefreshed
?2. @проверка jnpdx
3. @Альберт, ты пытаешься обновлять его каждые пять секунд?
4. Вы должны добавить пять секунд к текущему времени, а не добавлять к последнему времени userrefreshedapi
5. @LeoDabus да, не уверен, что вы думаете о таймере, но я пробовал с таймером, но дело в том, что, когда пользователь выходит из фонового режима на следующий день и хочет обновиться, ему/ей приходится ждать этого времени, и это неприменимо. Поэтому я решил сохранить метку времени
Ответ №1:
Вы делаете это намного сложнее, чем следовало бы. Просто сохраните дату «истечения срока действия». Когда вы читаете это, просто сравните, прошло оно или нет.
@AppStorage("expiration")
var expiration: Date = Date(timeIntervalSinceNow: 5)
func canUserRefreshAPI() -> Bool {
let now = Date()
if expiration < now {
expiration = Date(timeIntervalSinceNow: 5)
return true
} else {
return false
}
}