Ios 如何在Swift中将JSON数据保存到UserDefault?
我用Alamofire发出了一个post请求。这是我使用端点从服务器获取数据的代码:Ios 如何在Swift中将JSON数据保存到UserDefault?,ios,swift,Ios,Swift,我用Alamofire发出了一个post请求。这是我使用端点从服务器获取数据的代码: Alamofire.request("http://192.168.80.21:3204/api/auth/signin", method: .post, parameters: parameters,encoding: JSONEncoding.default, headers: nil).responseJSON { response in swi
Alamofire.request("http://192.168.80.21:3204/api/auth/signin", method: .post, parameters: parameters,encoding: JSONEncoding.default, headers: nil).responseJSON {
response in
switch response.result {
case .success(let value):
let json = JSON(value)
print(json)
break
case .failure(let error):
print("Error :- \(error)")
}
}
}
这是我从服务器上得到的数据:
{
"accessToken" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NTIsInJvbGUiOjEsImlhdCI6MTYwMzg2ODUxNCwiZXhwIjoxNjAzOTU0OTE0fQ.y68w8XQfqFZDVgaxiuFuVCOqaI5e5vZ-SfoDB_Ctxro",
"role" : "admin",
"auth" : true
}
我想将响应保存到UserDefault以供进一步使用。帮助我将数据保存到Userdefault,并检索和打印数据。如果使用全局变量。您可以根据您的目的使用
save
方法,如下所示:
let objects = [yourObjectClass]()
func save() {
let jsonEncoder = JSONEncoder()
if let savedData = try? jsonEncoder.encode(objects) {
let defaults = UserDefaults.standard
defaults.set(savedData, forKey: "objects")
} else {
print("Failed to save objects.")
}
}
}
accessToken
func setInDefault<T: Codable>(key: String, type: T.Type, data: T?) {
guard let data = data else {
return
}
do {
let encoder = JSONEncoder()
let encodeData = try encoder.encode(data)
let dict:[String:Any] = try JSONSerialization.jsonObject(with: encodeData, options: .allowFragments) as! [String : Any]
let data = NSKeyedArchiver.archivedData(withRootObject: dict)
//set user data in defaults
UserDefaults.standard.set(data, forKey: key)
UserDefaults.standard.synchronize()
} catch {
print(error)
//handle error
}
}
func getFromDefault<T: Codable>(key: String, type: T.Type) -> T? {
let archieved = UserDefaults.standard.value(forKey: key)
let dict = NSKeyedUnarchiver.unarchiveObject(with: archieved as? Data ?? Data())
let decoder = JSONDecoder()
do {
if let dic = dict {
let data = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)
return try decoder.decode(type, from: data)
}
} catch {
print(error)
//handle error
}
return nil
}
这里,
参数:data
是类型为T
的通用参数。所以这里您需要传递从服务器获得的响应数据。(应该是Codable
类类型)
参数:AuthUser
is
struct AuthUser : Codable {
let accessToken : String?
let role: String?
let auth: Bool?
enum CodingKeys: String, CodingKey {
case accessToken = "accessToken"
case role = "role"
case auth = "auth"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
accessToken = try values.decodeIfPresent(String.self, forKey: .accessToken)
role = try values.decodeIfPresent(String.self, forKey: .role)
auth = try values.decodeIfPresent(Bool.self, forKey: .auth)
}
}
要获取数据,请执行以下操作:
let data = getFromDefault(key: "userData", type: AuthUser.self)
print(data)
您可以使用下面的函数代码将JSON模型数据保存在Userdefaults中
func saveData(data: yourModelData){
var userDefaults = UserDefaults.standard
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: yourModelData)
userDefaults.set(encodedData, forKey: "yourKey")
userDefaults.synchronize()
}
和从Userdefaults检索数据使用此功能
func getData() -> yourModelData {
var userDefaults = UserDefaults.standard
let decoded = userDefaults.data(forKey: "yourKey")
let decodedData = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [yourModelData]
return decodedData
}
创建符合
Codable
struct Auth: Codable {
let accessToken, role: String
let auth: Bool
}
并扩展UserDefaults
extension UserDefaults {
func auth(forKey defaultName: String) -> Auth? {
guard let data = data(forKey: defaultName) else { return nil }
do {
return try JSONDecoder().decode(Auth.self, from: data)
} catch { print(error); return nil }
}
func set(_ value: Auth, forKey defaultName: String) {
let data = try? JSONEncoder().encode(value)
set(data, forKey: defaultName)
}
}
现在,您可以使用auth(forKey:)
和set(uquo:forKey:)
直接读取和写入auth
实例
删除SwiftyJSON并更改Alamofire部分,以使用JSONDecoder
Alamofire.request("http://192.168.80.21:3204/api/auth/signin", method: .post, parameters: parameters).responseData {
response in
switch response.result {
case .success(let data):
do {
let auth = try JSONDecoder().decode(Auth.self, from: data)
print(auth)
UserDefaults.standard.set(auth, forKey: "Auth")
} catch { print(error) }
case .failure(let error):
print("Error :- \(error)")
}
}
要读取实例,请编写
let auth = UserDefaults.standard.auth(forKey: "Auth")
参数:数据是要存储的数据。请检查编辑的答案。注意,在大多数情况下类型参数不是必需的,至少可以使用默认值
type:T.type=T.self
。
let auth = UserDefaults.standard.auth(forKey: "Auth")