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

0 Answers0