我想保存响应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函数
您可以将所有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
}
你在做什么是用相同的密钥将数据存储在用户默认的循环中。因此,每次循环运行时,旧值将替换为新值。这就是为什么当您读取数据时,您将始终从您的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)
}
}
首先,关键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
协议。