如何在swift中将json数组保存和检索到用户默认值?
Posted
技术标签:
【中文标题】如何在swift中将json数组保存和检索到用户默认值?【英文标题】:how to save and retrieve json array to user default in swift? 【发布时间】:2019-03-30 04:10:22 【问题描述】:我想保存响应 json 数组并使用 userdefault 检索 json 数组,直到现在我只能在 func fetchdata() 中显示所有 json 数组,当我尝试在 viewdidLoad 中检索时,我只得到一个响应 json 数组。 我想在 viewdidLoad 中获取所有响应 json 数组。 如何实现?
这是我的代码:
import UIKit
import SwiftyJSON
import Alamofire
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
fetchData()
let tabledata = UserDefaults.standard.object(forKey: "id") // here i retrieve data and only get one response
print("table:\(tabledata)")
func fetchData()
Alamofire.request("https://jsonplaceholder.typicode.com/users", encoding: URLEncoding.default).responseJSON
response in
switch response.result
case .success(let value):
let json = JSON(value)
print(json)
for item in json.array!
let address = item["address"]["city"].string
let id = item["id"].stringValue
let userName = item["username"].string
UserDefaults.standard.set(id, forKey: "id")
let tabledata = UserDefaults.standard.object(forKey: "id") // here i retrieve data and get all response for id
print("table:\(tabledata)")
case .failure(let error):
print(error)
当我在视图中检索 didLoad 时,我只得到响应:
table:Optional(10)
当我在 fetchData 函数中检索时,我得到了所有响应:
table:Optional(1)
table:Optional(2)
table:Optional(3)
table:Optional(4)
table:Optional(5)
table:Optional(6)
table:Optional(7)
table:Optional(8)
table:Optional(9)
table:Optional(10)
我想获取 viewDidLoad 或 viewWillAppear 的 fetchData 函数中的所有响应
【问题讨论】:
首先,你不应该把它保存到UserDefaults
【参考方案1】:
您可以将所有 id 存储在UserDefaults
中,如下所示。
func fetchData()
Alamofire.request("https://jsonplaceholder.typicode.com/users", encoding: URLEncoding.default).responseJSON
response in
switch response.result
case .success(let value):
let json = JSON(value)
print(json)
let ids = json.arrayValue.map $0["id"].stringValue
UserDefaults.standard.set(ids, forKey: "id")
case .failure(let error):
print(error)
现在您可以访问所有 ID,如下所示。任何你想使用的地方。
guard let ids = UserDefaults.standard.stringArray(forKey: "id") else
print(ids)
return
【讨论】:
【参考方案2】:你在做什么是将你的数据存储在用户默认的循环中,使用相同的键。因此,每次循环运行时,您的旧值都会被新值替换。 这就是为什么当您读取数据时,您总是会从 json 响应中获得最后一个值。
尝试在循环之外存储值并将NSArray
typed 值存储在用户默认值中。
查看以下代码:
let json = JSON(value)
let userDefault = UserDefaults.standard
UserDefaults.standard.set(json.array!, forKey: "yourkey")
从UserDefaults
阅读您的价值
if userDefault.object(forKey: "yourkey") != nil
if let array = yourkey.object(forKey: "aa") as? NSArray
print(array)
【讨论】:
【参考方案3】:首先,键 id
的值是一个整数,而不是字符串,请注意缺少的双引号。
其次,在viewDidLoad
中检查数据是否已保存并仅在未保存时才获取它。
override func viewDidLoad()
super.viewDidLoad()
guard let tabledata = UserDefaults.standard.array(forKey: "id") as? [Int] else
fetchData()
return
print("table:\(tabledata)")
出现问题是因为您在循环内覆盖 UserDefaults
中的值,因为您始终为同一个键保存值。
创建一个临时数组并保存数组循环后一次
func fetchData()
Alamofire.request("https://jsonplaceholder.typicode.com/users", encoding: URLEncoding.default).responseJSON
response in
switch response.result
case .success(let value):
let json = JSON(value)
print(json)
var idArray = [Int]()
for item in json.array!
let address = item["address"]["city"].string
let id = item["id"].intValue
idArray.append(id)
let userName = item["username"].string
UserDefaults.standard.set(idArray, forKey: "id")
print("table:\(idArray)")
case .failure(let error):
print(error)
在 Swift 4+ 中,强烈建议放弃 SwiftyJSON
和任何其他第三方 JSON 解析库以支持 Codable
协议。
【讨论】:
以上是关于如何在swift中将json数组保存和检索到用户默认值?的主要内容,如果未能解决你的问题,请参考以下文章
如何保存响应 JSON 数组并在 swift 中使用用户默认值进行检索
在 Swift 中将 UIView 保存和检索为 NSData