2016-01-27 2 views
0

Я пишу приложение, которое требует сброса ключа, хранящегося в NSUserDefaults каждый день. (В 00:00 часов)Сброс ключа NSUserDefault каждый день в Swift

Я достиг этого, но метод, который я использовал, является беспорядочным и ненадежным.

Есть ли простой способ достичь моей цели?

Вот код.

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)" 

    } 
} 
+0

Пожалуйста, напишите, что у вас есть, таким образом мы сможем лучше всего решить, как улучшить. – Otra

+0

Это ленивый код. Но в любом случае я подниму это на мгновение. @Otra – Sanidhay

+3

Проблема в том, как вы пытаетесь выполнить свою задачу. Не нужно делать это в полночь. Просто сохраните дату, когда вы сохранили настройки, и в следующий раз, когда пользователь откроет приложение, проверьте, была ли эта дата в тот же день, что и сегодня, в противном случае сбросить ее. –

ответ

3

Вы можете создать расширение NSUserDefault вычисленного свойство с геттер и сеттер, чтобы сохранить пользовательскую дату последнего доступа. NSCalendar имеет метод isDateInToday, который вы можете использовать в вашем инкубаторе, чтобы removePersistentDomainForName если дата последнего доступа не в тот же день, как сегодня:

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 ?? "") 
    } 
} 

Просто установите пользователя дата последнего доступа, когда ваш пользователь открывает приложение:

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

можете ли вы объяснить, как проверить, изменилась ли дата или нет? – Sanidhay

+0

каждый раз, когда вы устанавливаете дату внутри установщика, есть условное значение. Если нет (!) Дата в том же форматеDayAsToday, удалите постоянный домен –

Смежные вопросы