如何将 json 数组保存和检索到 swift 中的用户默认值?

how to save and retrieve json array to user default in swift?

我想保存响应 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 函数

你在做什么是用相同的密钥循环将你的数据存储在用户默认值中。所以每次循环都是 运行 你的旧值将被新值替换。 这就是为什么当您读取数据时,您总是会从 json 响应中获得最后一个值。

尝试在循环之外存储值,并在用户默认值中存储NSArray键入的值。

检查下面的代码:

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 协议。

您可以将所有 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 { [=10=]["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
 }