如何在 swift 4 中保存有关用户默认值的 json 数据
How to save json data on userdefaults in swift 4
这是我的模型class
class UserRoot : Mappable {
var success : Bool!
var user : UserDetails!
var error = ""
required init?(map: Map) {
}
func mapping(map: Map) {
success <- map["success"]
user <- map["user"]
error <- map["error"]
}
}
成功登录后,我想将此数据保存在用户默认值中,这样当用户不必再次提供登录凭据时。这是我的代码
class Default : NSObject{
static func saveToSharedPrefs(user: UserDetails!) {
let d = UserDefaults.standard
if user != nil {
d.set(Mapper().toJSONString(user, prettyPrint: false) , forKey: "USERDETAILS")
} else {
d.set(nil, forKey: "USERDETAILS")
}
d.synchronize()
}
}
您可以使用数据将此 json 存储在用户默认值中,如下所示:
let myData = NSKeyedArchiver.archivedData(withRootObject: myJson)
UserDefaults.standard.set(myData, forKey: "userJson")
let recovedUserJsonData = UserDefaults.standard.object(forKey: "userJson")
let recovedUserJson = NSKeyedUnarchiver.unarchiveObject(with: recovedUserJsonData)
Edit
你不能在 NSUserDefault 中存储映射器,你只能存储 NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。
NSKeyedArchiver
将您的映射器转换为 NSData
,您可以将其存储到 userdefault
.
Make sure your model class is inherited from NSObject
class otherwise it will crash at run time.
存储数据:
let data = NSKeyedArchiver.archivedData(withRootObject: <Your model class>)
UserDefaults.standard.set(data, forKey: "userDetails")
检索数据并将数据转换回
if let data = UserDefaults.standard.value(forKey: "userDetails") as? Data {
if let dict = NSKeyedUnarchiver.unarchiveObject(with: data) as? <Your model class> {
print(dict)
}
}
In swift 4 最好使用 JSONEncoder 将您的 Swift 对象编码为 JSON 和 JSONDecoder 将你的 JSON 解码为 Swift 对象,确认 Codable 协议到你的模型 class 之前编码和解码。
使用 ObjectMapper pod。
class GooglePlace : Mappable {
var id = ""
var addressTitle = ""
var formattedAddress = ""
var latitude : Double?
var longitude : Double?
required init?(map: Map) {
}
func mapping(map: Map) {
addressTitle <- map["name"]
formattedAddress <- map["formatted_address"]
latitude <- map["geometry.location.lat"]
longitude <- map["geometry.location.lng"]
id <- map["id"]
}
}
var placesesSearchHistory : [GooglePlace]? = []
if let jsonString = placesesSearchHistory?.toJSONString(prettyPrint: true) {
//Store in UserDefaults
UserDefaults.standard.set(jsonString, forKey: "addressSearchHistory")
}
//retrieve from UserDefaults
if let dataArrayString = (UserDefaults.standard.string(forKey: "addressSearchHistory")) as? String {
if let dataObject = Mapper<GooglePlace>().mapArray(JSONString: dataArrayString) {
placesesSearchHistory = dataObject
}
}
这是我的模型class
class UserRoot : Mappable {
var success : Bool!
var user : UserDetails!
var error = ""
required init?(map: Map) {
}
func mapping(map: Map) {
success <- map["success"]
user <- map["user"]
error <- map["error"]
}
}
成功登录后,我想将此数据保存在用户默认值中,这样当用户不必再次提供登录凭据时。这是我的代码
class Default : NSObject{
static func saveToSharedPrefs(user: UserDetails!) {
let d = UserDefaults.standard
if user != nil {
d.set(Mapper().toJSONString(user, prettyPrint: false) , forKey: "USERDETAILS")
} else {
d.set(nil, forKey: "USERDETAILS")
}
d.synchronize()
}
}
您可以使用数据将此 json 存储在用户默认值中,如下所示:
let myData = NSKeyedArchiver.archivedData(withRootObject: myJson)
UserDefaults.standard.set(myData, forKey: "userJson")
let recovedUserJsonData = UserDefaults.standard.object(forKey: "userJson")
let recovedUserJson = NSKeyedUnarchiver.unarchiveObject(with: recovedUserJsonData)
Edit
你不能在 NSUserDefault 中存储映射器,你只能存储 NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。
NSKeyedArchiver
将您的映射器转换为 NSData
,您可以将其存储到 userdefault
.
Make sure your model class is inherited from
NSObject
class otherwise it will crash at run time.
存储数据:
let data = NSKeyedArchiver.archivedData(withRootObject: <Your model class>)
UserDefaults.standard.set(data, forKey: "userDetails")
检索数据并将数据转换回
if let data = UserDefaults.standard.value(forKey: "userDetails") as? Data {
if let dict = NSKeyedUnarchiver.unarchiveObject(with: data) as? <Your model class> {
print(dict)
}
}
In swift 4 最好使用 JSONEncoder 将您的 Swift 对象编码为 JSON 和 JSONDecoder 将你的 JSON 解码为 Swift 对象,确认 Codable 协议到你的模型 class 之前编码和解码。
使用 ObjectMapper pod。
class GooglePlace : Mappable {
var id = ""
var addressTitle = ""
var formattedAddress = ""
var latitude : Double?
var longitude : Double?
required init?(map: Map) {
}
func mapping(map: Map) {
addressTitle <- map["name"]
formattedAddress <- map["formatted_address"]
latitude <- map["geometry.location.lat"]
longitude <- map["geometry.location.lng"]
id <- map["id"]
}
}
var placesesSearchHistory : [GooglePlace]? = []
if let jsonString = placesesSearchHistory?.toJSONString(prettyPrint: true) {
//Store in UserDefaults
UserDefaults.standard.set(jsonString, forKey: "addressSearchHistory")
}
//retrieve from UserDefaults
if let dataArrayString = (UserDefaults.standard.string(forKey: "addressSearchHistory")) as? String {
if let dataObject = Mapper<GooglePlace>().mapArray(JSONString: dataArrayString) {
placesesSearchHistory = dataObject
}
}