Как сохранить и получить массив JSON для пользователя по умолчанию в Swift? - PullRequest
0 голосов
/ 30 марта 2019

Я хочу сохранить ответный массив json и извлечь массив json, используя userdefault, до сих пор я могу отображать только все массивы json в функции func fetchdata (), когда я пытаюсь извлечь из viewdidLoad, я получаю только один ответный массив json. Я хочу получить все ответные массивы json в viewdidLoad. как этого добиться?

вот мой код:

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)

Я хочу получить все ответы, как в функции fetchData для viewDidLoad или viewWillAppear

Ответы [ 3 ]

0 голосов
/ 30 марта 2019

Прежде всего, значение для ключа 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 протокол.

0 голосов
/ 30 марта 2019

Вы можете сохранить все идентификаторы в 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)
        }
    }
}

Теперь вы можете получить доступ ко всем идентификаторам, как показано ниже.где вы хотите использовать.

guard let ids = UserDefaults.standard.stringArray(forKey: "id") else {
       print(ids)
       return
 }
0 голосов
/ 30 марта 2019

что вы делаете, это храните ваши данные по умолчанию в цикле с тем же ключом.поэтому при каждом цикле времени ваше старое значение будет заменено новым.поэтому, когда вы читаете ваши данные, вы всегда получите последнее значение из вашего ответа 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) 
      }
 }
...