Search code examples
swiftuserdefaults

Update View every day


looking for a possibility to update the view every day.

this is what I have tried... but it doesn't even print "test2"

var WordNumber = 0
override func viewDidLoad() {
    super.viewDidLoad()
    let userDefault = UserDefaults.standard
    if let lastRe = userDefault.dictionary(forKey: "lastRe") {
        print("test2")
        if let letztesDatum = lastRe ["date"] as? NSDate {
            print("test3")
            if let index = lastRe ["index"] as? Int {
                print("test4")
                if abs(letztesDatum.timeIntervalSinceNow) > 1 {
                    print("test5")
                    WordNumber = index + 1
                    let  _ : [NSObject : AnyObject] = ["date" as NSObject : NSDate(),
                                                       "index" as NSObject : WordNumber as AnyObject]
                }
                print("test6")
                nextDay() //update lbl
                userDefault.set(lastRe, forKey: "lastRe")
                userDefault.synchronize()
            }
        }
    }
}

Solution

  • Simpler solution: Save only the day integer and add an observer to be notified when the day changes

    override func viewDidLoad() {
        super.viewDidLoad()
        let today = Calendar.current.component(.day, from: Date())
        let lastRe =  UserDefaults.standard.integer(forKey: "lastRe")
        if today != lastRe {
            updateView(day: today)
        }
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        NotificationCenter.default.addObserver(forName: .NSCalendarDayChanged, object:nil, queue: .main) { [weak self] _ in 
           let today = Calendar.current.component(.day, from: Date())
           self?.updateView(day: today)
        }
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        NotificationCenter.default.removeObserver(self, name:.NSCalendarDayChanged, object:nil)
    }
    
    func updateView(day : Int) {
        nextDay()
        UserDefaults.standard.set(day, forKey: "lastRe")
    }