Sanidhay
Sanidhay

Reputation: 159

Reset NSUserDefault key everyday in Swift

I am writing an app which requires to reset a key stored in NSUserDefaults every day. (At 00:00 hours)

I have achieved this but the method I used is a messy and unreliable one.

Is there an easy way to achieve my goal?

Here is the code.

    extension NSDate
    {

        func month() -> Int
        {
            let calendar = NSCalendar.currentCalendar()
            let components = calendar.components(.Month, fromDate: self)
            let month = components.month
            return month
        }


        func date() -> Int
        {
            let calendar = NSCalendar.currentCalendar()
            let components = calendar.components(.Day, fromDate: self)
            let date = components.day

            return date
        }

        func hour() -> Int
        {
            //Get Hour
            let calendar = NSCalendar.currentCalendar()
            let components = calendar.components(.Hour, fromDate: self)
            let hour = components.hour

            //Return Hour
            return hour
        }


        func minute() -> Int
        {
            //Get Minute
            let calendar = NSCalendar.currentCalendar()
            let components = calendar.components(.Minute, fromDate: self)
            let minute = components.minute

            //Return Minute
            return minute
        }

        func toShortTimeString() -> String
        {
            //Get Short Time String
            let formatter = NSDateFormatter()
            formatter.timeStyle = .ShortStyle
            let timeString = formatter.stringFromDate(self)

            //Return Short Time String
            return timeString
        }
    }


class ViewController: UIViewController {


    var totalcounterme:Int! //stored variable
    let currentDate = NSDate() //current date
    var todaysDate:Int! //date variable for storing local value




    @IBOutlet weak var todayTotal: UILabel! //total cigarrete count value

    @IBOutlet weak var numberC: UITextField! //text label value

    @IBAction func countPressed(sender: AnyObject) {
        var counter = totalcounterme //add local value to the counter
        if numberC.text != "" {
        counter = counter + Int(numberC.text!)! //add input value to counter
        numberC.text = ""
        todayTotal.text = "\(counter)" //display value of counter
        NSUserDefaults.standardUserDefaults().setInteger(counter, forKey: "storedCounter") //store counter value
        totalcounterme = NSUserDefaults.standardUserDefaults().integerForKey("storedCounter") //return stored value
        todaysDate = currentDate.date()
            if todaysDate > NSUserDefaults.standardUserDefaults().integerForKey("finaldate") {
                NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "storedCounter")

            } else if todaysDate < NSUserDefaults.standardUserDefaults().integerForKey("finaldate") {
                if currentDate.month() > NSUserDefaults.standardUserDefaults().integerForKey("finalmonth") {
                    NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "storedCounter")
                }
            }

        NSUserDefaults.standardUserDefaults().setInteger(todaysDate, forKey: "finaldate") //set todays date in value
        NSUserDefaults.standardUserDefaults().setInteger(currentDate.month(), forKey: "finalmonth") //set month

        }
        }



    override func viewDidLoad() {
        super.viewDidLoad()


        let month = NSUserDefaults.standardUserDefaults().integerForKey("finalmonth")
        let today = NSUserDefaults.standardUserDefaults().integerForKey("finaldate")
        if currentDate.date() > today {
            NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "storedCounter")
        } else if currentDate.date() < today {
            if currentDate.month() > month {
            NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "storedCounter")
            }
        }

        totalcounterme = NSUserDefaults.standardUserDefaults().integerForKey("storedCounter")

        todayTotal.text = "\(totalcounterme)"

    }
}

Upvotes: 1

Views: 1877

Answers (1)

Leo Dabus
Leo Dabus

Reputation: 236305

You can create a NSUserDefault extension computed property with a getter and a setter to save the user last access date. NSCalendar has a method called isDateInToday that you can use inside your setter to removePersistentDomainForName if the last access date is not in same day as today:

extension UserDefaults {

    static let defaults = UserDefaults.standard

    static var lastAccessDate: Date? {
        get {
            return defaults.object(forKey: "lastAccessDate") as? Date
        }
        set {
            guard let newValue = newValue else { return }
            guard let lastAccessDate = lastAccessDate else {
                defaults.set(newValue, forKey: "lastAccessDate")
                return
            }
            if !Calendar.current.isDateInToday(lastAccessDate) {
                print("remove Persistent Domain")
                UserDefaults.reset()
            }
            defaults.set(newValue, forKey: "lastAccessDate")
        }
    }

    static func reset() {
        defaults.removePersistentDomain(forName: Bundle.main.bundleIdentifier ?? "")
    }
}

Just set your user last access date when your user opens your app:

override func viewDidLoad() {
    super.viewDidLoad()
    UserDefaults.lastAccessDate = Date()
} 

Upvotes: 4

Related Questions