0

I used the following reference How to use NSUserDefaults to store an array of custom classes in Swift? to create a UserHours class and Save/Load data from UserDefaults in Swift. However, when I do so, the new objects that are appended to class are not saved/loaded. Could you please help me understand what I am doing wrong here. I do not get any error logs in the screen that can help me debug.

class Database {

    var users = [String: User]()
    var vacationRequest = [VacationRequest]()
    var userHours = [UserHours]()
    let userID = DatabaseInstance.userID
    let userDefaults = UserDefaults.standard

    func addUserHours(hours: UserHours) {
        self.userHours.append(hours)
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: self.userHours)
        userDefaults.set(encodedData, forKey: DatabaseInstance.userhour)
        userDefaults.synchronize()
    }

    func getUserHours() -> [UserHours] {
        if let data = userDefaults.data(forKey: DatabaseInstance.userhour),
            let userHoursList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [UserHours] {
            self.userHours = userHoursList;
            return userHoursList;
        } else {
            print("There is an issue")
        }
        return self.userHours
    }
}



class UserHours: NSObject, NSCoding{
    var userId: String = ""
    var date: Date = Date()
    var startTime: Date = Date()
    var mealStart: Date = Date()
    var mealEnd: Date = Date()
    var endTime: Date = Date()

    init(userId: String, date: Date, startTime: Date, mealStart: Date, mealEnd : Date, endTime: Date) {
        self.userId = userId
        self.date = date
        self.startTime = startTime
        self.mealStart = mealStart
        self.mealEnd = mealEnd
        self.endTime = endTime
    }

    required convenience init(coder decoder: NSCoder) {
        let userId = decoder.decodeObject(forKey: "userId") as! String
        let date = decoder.decodeObject(forKey: "date") as! Date
        let startTime = decoder.decodeObject(forKey: "startTime") as! Date
        let mealStart = decoder.decodeObject(forKey: "mealStart") as! Date
        let mealEnd = decoder.decodeObject(forKey: "mealEnd") as! Date
        let endTime = decoder.decodeObject(forKey: "endTime") as! Date
        self.init(userId: userId, date: date, startTime: startTime, mealStart: mealStart, mealEnd : mealEnd, endTime: endTime)
    }

    func encode(with coder: NSCoder) {
        coder.encode(userId, forKey: "userId")
        coder.encode(date, forKey: "date")
        coder.encode(startTime, forKey: "startTime")
        coder.encode(mealStart, forKey: "mealStart")
        coder.encode(mealEnd, forKey: "mealEnd")
        coder.encode(endTime, forKey: "endTime")
    }
}
2
  • are you getting any errors in the console? Commented Nov 28, 2017 at 8:24
  • @Oxthor no I am not. But the data doesnot get stored. Don't know why. Commented Nov 28, 2017 at 14:35

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.