Сохранить данные JSON как переменную - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь выяснить, как сохранить данные JSON в переменную для последующего использования. Как мне его сохранить, и можно ли использовать переменную в другом контроллере представления или мне нужно сделать еще один запрос для извлечения данных?

Это мой код:

@IBAction func signinTapped(_ sender: UIButton) {

    guard let url = URL(string: "http://XXXXXX/TestReqIOS.php") else {
        return
    }


    let email = txtEmail.text!
    let password = txtPassword.text!

    let data : Data = "loginSubmit=1&email=\(email)&password=\(password)&grant_type=password".data(using: .utf8)!
    var request : URLRequest = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField:"Content-Type");
    request.setValue(NSLocalizedString("lang", comment: ""), forHTTPHeaderField:"Accept-Language");
    request.httpBody = data

    print("Calling API")

    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)
    // vs let session = URLSession.shared
    // make the request
    let task = session.dataTask(with: request, completionHandler: {
        (data, response, error) in

        if let error = error {
            print("error")
        }
        else if let response = response {
            print("response")

        }
        else if let data = data {
            print(data)
        }

        DispatchQueue.main.async { // Correct
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            print(String(data: responseData, encoding: String.Encoding.utf8) ?? "")
        }
    })
    task.resume()
}

Который вернется:

{
  "id": "7",
  "first_name": "John",
  "last_name": "Doe",
  "email": "JohnDoe@text.com",
  "created": "2019-03-11",
  "modified": "2019-03-10",
}

1 Ответ

2 голосов
/ 11 марта 2019

Было бы лучше использовать структуру, например, в вашем случае:

struct Data: Codable {
    let id: Int
    let first_name: String
    let last_name: String
    let email: String
    let created: Date
    let modified: Date
}

Затем вы создаете переменную той структуры, в которой вы будете хранить ее:

var dataVariable = [Data]()

Тогда вы можете сделать свой URL-вызов как:

 func getData(arr: Bool, completion: @escaping (Bool) -> ()) {

    let urlJSON = "URL"

    guard let url = URL(string: urlJSON) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else { return }

        do {

            let getData = try JSONDecoder().decode([Data].self, from: data)
            self.dataVariable = getData


        } catch let jsonErr {
            print("error serializing json: \(jsonErr)")

        }
        completion(arr)

        }.resume()

}

Затем вы можете получить доступ ко всему этому из dataVariable var. Если вы делаете это в классе Manager, вы можете получить к нему доступ из любого ViewController.

Для доступа:

let firstNameString = dataVariable[0].first_name

Если не существует нескольких одинаковых деревьев, просто убедитесь, что оно:

let getData = try JSONDecoder().decode(Data.self, from: data)

Edit:

В вашем случае укажите выше:

  let task = session.dataTask(with: request, completionHandler: {
    (data, response, error) in

    if let error = error {
        print("error")
    }
    else if let response = response {
        print("response")

    }
    else if let data = data {
         let getData = try JSONDecoder().decode([Data].self, from: data)
            self.dataVariable = getData // <- Just decode here
        print(data)
    }

    DispatchQueue.main.async { // Correct
        guard let responseData = data else {
            print("Error: did not receive data")
            return
        }
        print(String(data: responseData, encoding: String.Encoding.utf8) ?? "")
    }
})
task.resume()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...