使用 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)!
这个返回**<ABC.User: 0x7f84f740c440>**
但是当我试图从 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 类的详细信息的主要内容,如果未能解决你的问题,请参考以下文章