如何快速保存和检索json数组到用户默认值?

时间:2019-03-30 04:10:22

标签: arrays swift alamofire swifty-json userdefaults

我想保存响应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)
            }
        }
    }
}

当我在didDiLoad视图中检索时,我只会得到响应:

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函数中

3 个答案:

答案 0 :(得分:0)

您正在做的是使用相同的密钥将数据默认存储在用户默认值中。因此,每次运行循环时,您的旧值都会被新值替换。 这就是为什么当您读取数据时,总是会从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) 
      }
 }

答案 1 :(得分:0)

首先,键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协议。

答案 2 :(得分:0)

您可以如下所示将所有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
 }