【问题标题】:how to save and retrieve json array to user default in swift?如何在swift中将json数组保存和检索到用户默认值?
【发布时间】: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

标签: arrays swift alamofire swifty-json 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 响应中获得最后一个值。

    尝试在循环之外存储值并将NSArraytyped 值存储在用户默认值中。

    查看以下代码:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多