Swift - сброс данных через месяц - PullRequest
1 голос
/ 29 апреля 2019

У меня есть приложение, которое подводит итог пользовательского ввода.Эти данные хранятся.Я хочу, чтобы эти пользовательские данные были сброшены до 0 через месяц после того, как он начал использовать приложение.По истечении одного месяца startDate, очевидно, будет днем ​​сброса данных.

Пока у меня есть:

func checkIfClearData() {
    let startDate: Date = Date()
    var monthComponent = DateComponents()
    monthComponent.month = 1

    let theCalendar = Calendar.current
    let endDate = theCalendar.date(byAdding: monthComponent, to: startDate)
}

Я застрял.Как включить currentDate и как правильно использовать такую ​​функцию, поскольку ее можно вызывать только один раз в месяц?В противном случае я считаю, что endDate увеличится и никогда не будет достигнуто.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Используйте следующее для сравнения startDate с endDate

if Date().timeIntervalSince(endDate) < 0 {
    // endDate ahead
} else {
    // endDate expired
}

Пример для начала работы

class DataTimer {

    static var shared = DataTimer()

    var startDate: Date!
    var endDate: Date!

    private init() {
        check()
    }

    func check() {
        guard
            let startDate = UserDefaults.standard.object(forKey: "kStartDate") as? Date,
            let endDate = Calendar.current.date(byAdding: .month, value: 1, to: startDate)
        else {
            self.resetDates()
            return
        }

        var interval = Date().timeIntervalSince(endDate)
        guard interval < 0 else {
            self.resetUserData()
            self.resetDates()
            return
        }

        self.startDate = startDate
        self.endDate = endDate

        // log remaining time
        interval = abs(interval)
        let log: [Int] = [86400.0, 3600.0, 60.0].map { value in
            guard interval > value else { return 0 }

            let returnValue = Int(floor(interval / value))
            interval.formTruncatingRemainder(dividingBy: value)
            return returnValue
        }
        print("Remaining: \(log[0])d \(log[1])h \(log[2])m \(Int(interval))s")
    }

    private func resetUserData() { }

    private func resetDates() {
        self.startDate = Date()
        self.endDate = Calendar.current.date(byAdding: .month, value: 1, to: startDate)!
        UserDefaults.standard.set(startDate, forKey: "kStartDate")
    }
}

Использование-1

DataTimer.shared.check()

Использование-2 каждый раз, когда приложение запускается / входит на передний план в AppDelegate.swift

func applicationDidBecomeActive(_ application: UIApplication) {
    DataTimer.shared.check()
}
1 голос
/ 29 апреля 2019

Когда приложение запустится, проверьте ключ (например, «startDate») в UserDefaults.

Если это ноль, сохраните текущую дату в этом ключе.

Если это не ноль, прочитайте это.Сравните сохраненную дату и сегодняшнюю дату.Если прошедшее время составляет <1 месяц, прочитайте сохраненные данные как обычно.Если прошедшее время составляет> = 1 месяц, удалите все сохраненные данные и сохраните сегодняшнюю дату в ключе UserDefaults, чтобы начать заново.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...