ios - Reset NSUserDefault key everyday in Swift -
i writing app requires reset key stored in nsuserdefaults every day. (at 00:00 hours)
i have achieved method used messy , unreliable one.
is there easy way achieve goal?
here 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 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 counter if numberc.text != "" { counter = counter + int(numberc.text!)! //add input value 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)" } }
you can create nsuserdefault extension computed property getter , setter save user last access date. nscalendar has method called isdateintoday can use inside setter removepersistentdomainforname if last access date not in same day today:
extension userdefaults { static let defaults = userdefaults.standard static var lastaccessdate: date? { { 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 user last access date when user opens app:
override func viewdidload() { super.viewdidload() userdefaults.lastaccessdate = date() }
Comments
Post a Comment