使用 userdefault 保存并获取 Model 类的详细信息

Posted

技术标签:

【中文标题】使用 userdefault 保存并获取 Model 类的详细信息【英文标题】:Save and get details of Model class using userdefault 【发布时间】:2018-04-23 08:18:28 【问题描述】:

我有一个模型对象用户,在其中另一个模型对象是图片。

 "user": 
            "id": 1,
            "email": "abc.k@gmail.com",
     "user_profile_photo": 
                "id": 997,
                "user_id": 1,
                "photo_url": "https://newproduction.s3.amazonaws.com/profile_image/RkUJAczv5nWpUyFTgyTgMLChR.jpeg",
                              
         

我有两个模型类,一个是 User,另一个是 Picture 内部用户。 我将模型用户保存在 userdefault 中,如下所示

    //Get Response
    loginResponseObj = Mapper<LoginResponse>().map(JSONObject:(response.result.value))

   //Save user Details
   let userData = loginResponseObj.user!
        let data  = NSKeyedArchiver.archivedData(withRootObject: userData)
        UserDefaults.standard.set(data, forKey:"user")

当我尝试从 userdefaults 获取数据时,我得到 User 模型,但内部细节为零。

从 userdefault 获取 Userdetails 代码如下

guard let data = UserDefaults.standard.object(forKey: "user") as? Data
            else
        
            return UserModel()

        
        return (NSKeyedUnarchiver.unarchiveObject(with: data) as? UserModel)!

这个返回**&lt;ABC.User: 0x7f84f740c440&gt;**

但是当我试图从 User 获取 Picture 时,它返回 nil

用户模型中

 class User:NSObject,Mappable,NSCoding

 var email: String?
 var picture: Picture?

required init?(coder aDecoder: NSCoder) 
        self.email = aDecoder.decodeObject(forKey: "email") as? String
    
    func initWithCoder(aDecoder:NSCoder) -> UserModel
    
        self.email = aDecoder.decodeObject(forKey: "email") as? String

        return self
    

    func encode(with aCoder: NSCoder) 
        aCoder.encode(email, forKey: "email")
    

图片模型中

class Picture:Mappable,NSCoding

    var id: String?
    var photoURL: String?

    required init?(coder aDecoder: NSCoder) 
            self.id = aDecoder.decodeObject(forKey: "id") as? String
            self.photoURL = aDecoder.decodeObject(forKey: "photoURL") as? String
        
        func initWithCoder(aDecoder:NSCoder) -> Picture
        
            self.id = aDecoder.decodeObject(forKey: "id") as? String
            self.photoURL = aDecoder.decodeObject(forKey: "photoURL") as? String

            return self
        

        func encode(with aCoder: NSCoder) 
            aCoder.encode(id, forKey: "id")


 

注意:我正在使用 MVVM 模式和对象映射器

那么,我怎样才能获得包括 photo_url (User.Picture.photo_url) 在内的用户的全部详细信息?

【问题讨论】:

如何将用户转换为数据,使用 NSCoding?你的图片模型符合 NSCoding 吗? 用户模型有但图片模型没有 而用户模型呢?确保你的图片模型也符合 NSCoding 并且应该没问题。 现在查看我更新的问题我可以使用 UserDefaults 获取 User.email 但是当我尝试获取图片时它返回 nil 看下面的答案 【参考方案1】:

用户模型中

class User:NSObject,Mappable,NSCoding

 var email: String?
 var picture: Picture?

required init?(coder aDecoder: NSCoder) 
        self.email = aDecoder.decodeObject(forKey: "email") as? String
        self.picture = aDecoder.decodeObject(forKey: "picture") as? Picture
    
    func initWithCoder(aDecoder:NSCoder) -> UserModel
    
        self.email = aDecoder.decodeObject(forKey: "email") as? String
        self.picture = aDecoder.decodeObject(forKey: "picture") as? Picture
        return self
    

    func encode(with aCoder: NSCoder) 
        aCoder.encode(email, forKey: "email")
        aCoder.encode(picture, forKey: "picture")
    

图片模型中

class Picture: NSObject,Mappable,NSCoding 

var id: String?
var photoURL: String?

required init?(coder aDecoder: NSCoder) 
    self.id = aDecoder.decodeObject(forKey: "id") as? String
    self.photoURL = aDecoder.decodeObject(forKey: "photoURL") as? String

func initWithCoder(aDecoder:NSCoder) -> Picture

    self.id = aDecoder.decodeObject(forKey: "id") as? String
    self.photoURL = aDecoder.decodeObject(forKey: "photoURL") as? String

    return self


func encode(with aCoder: NSCoder) 
    aCoder.encode(id, forKey: "id")
    aCoder.encode(photoURL, forKey: "photoURL")

从用户默认设置中获取详细信息

guard let data = UserDefaults.standard.object(forKey: "user") as? Data
            else
        
            return User()

        
        return (NSKeyedUnarchiver.unarchiveObject(with: data) as? User)!

以上代码将返回 User 模型 使用此模型访问其变量

print(user.email)
print(user.picture.photoURL)

【讨论】:

以上是关于使用 userdefault 保存并获取 Model 类的详细信息的主要内容,如果未能解决你的问题,请参考以下文章

UserDefaults 如何获取自己保存的密钥?

从 UserDefaults 保存/获取 UIColor

UserDefaults - 使用 Xcode Simulator 时保存不一致

userdefaults 不保存按钮状态

UserDefaults 混淆了数据

Swift - UserDefaults 设置未保存在框架内