Как я могу разобрать JSON из остальных API в Swift - PullRequest
0 голосов
/ 25 июня 2019

Я изменяю код из проекта 'Взлом с помощью swift', чтобы взять файл JSON с помощью API и поместить его в табличное представление

Я немного растерялся, что делать дальшепопытался переместить вызов функции разбора и использовать закомментированный код

override func viewDidLoad() {
    super.viewDidLoad()

    let username = "UserName"
    let password = "Password"
    let loginData = String(format: "%@:%@", username,
                           password).data(using: String.Encoding.utf8)!
    let base64LoginData = loginData.base64EncodedString()

    let url = URL(string: "......")!
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("Basic \(base64LoginData)", forHTTPHeaderField:
        "Authorization")


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

        guard let data = data, error == nil else {
            print("error")
            return
        }

        if let httpStatus = response as? HTTPURLResponse {
            parse(json: data)
            print("status code = \(httpStatus.statusCode)")
        }
    }
    task.resume()
}

//       if let url = URL(string: urlstring){
//          if let data = try? Data(contentsOf: url){
//                parse(json: data)
//                return
//           }
//        }
//        showError()
//}

func parse(json: Data) {
    let decoder = JSONDecoder()

    if let jsonPetitions = try? decoder.decode(Petitions.self, from:
        json) {
        petitions = jsonPetitions.results
        tableView.reloadData()
    }
}

Я получил код состояния '200', поэтому я знаю, что вызов API работает нормально.

Кажется, проблема заключается в вызове функции синтаксического анализа. Я получаю следующую ошибку: «При вызове метода parse» при закрытии требуется явное «self».сделать семантику захвата явной "

1 Ответ

0 голосов
/ 25 июня 2019

1- Ошибка означает добавление self здесь

 self.parse(json: data)

2- Необходимо перезагрузить таблицу в главном потоке, так как обратный вызов URLSession.shared.dataTask выполняется в фоновом потоке, чтобы избежать непредвиденных результатов/ вылетает

DispatchQueue.main.async {
  self.tableView.reloadData()
}
...