Почему JSON возвращается как ноль для всего, кроме широты и долготы? - PullRequest
0 голосов
/ 26 февраля 2019
import UIKit

class ViewController: UIViewController {

@IBOutlet weak var tableview: UITableView!
var weatherList: [weatherJSON] = []


func downloadJSON() {
    let jsonUrlString = "https://api.darksky.net/forecast/59c6b6b7efd5c3fc0f617338cfae6c48/40.7127,-74.0059"
    guard let url = URL(string: jsonUrlString) else {return}
    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else {return}

        do {
            let JSON = try JSONDecoder().decode(weatherJSON.self, from: data)
            self.weatherList.append(JSON)
            print(self.weatherList)
            DispatchQueue.main.async {
                self.tableview.reloadData()
            }
        } catch let jsonErr {
            print("Error serializing json", jsonErr)
        }

        }.resume()
}

override func viewDidLoad() {
    super.viewDidLoad()
    downloadJSON()

}
}


extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return weatherList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! countryCell


cell.nameLabel?.text = "\(String(describing: weatherList[indexPath.row].latitude))"


    return cell
}
}

extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "segue1", sender: nil)
}
}

Редактировать: Я успешно вызвал данные JSON с помощью интерполяции строк -

cell.nameLabel? .Text = "(String (description: weatherList [indexPath.row] .latitude))"

но теперь единственная информация, возвращающая в моем звонке что угодно, кроме ноля, это широта и долгота.Почему единственное, что возвращается из моего вызова JSON успешно, ноль?Я что-то неправильно называю?Спасибо за вашу помощь.Если я должен сделать новое сообщение, пожалуйста, дайте мне знать.Я думаю, что это на ту же тему, так как это почти та же идея, что и оригинальная публикация мной вчера.

Сам Stackoverflow не позволит мне публиковать сообщения без добавления дополнительного текста, но, поскольку я уже сказал все, что мне нужно сказать, это просто наполнитель.

1 Ответ

0 голосов
/ 26 февраля 2019

Чтобы иметь лучший / более чистый код, возможно, вы хотите разделить ваш вызов API в функции (возможно, func makeRequest() или что-то), чтобы вызывать только эту функцию в вашем viewDidLoad.

Youиметь

var weatherList: [weatherJSON] = []

Это список с объектами weatherJSON, которые вы хотите, чтобы таблица показывала, но проблема в вашем запросе, когда вы перезагружаете данные в таблице, но не сохраняете свой ответ JSONв вашем weatherList.Сначала вы должны сохранить ответ JSON в вашей переменной weatherList или добавить результаты в этот массив.Сделав это, вы сможете заполнить свою таблицу, когда: cell.nameLabel?.text = weatherList[indexPath.row]

Также вам необходимо добавить свойство объекта Weatherlist, который вы хотите показать.что-то вроде weatherList[indexPath.row].name или имя свойства, которым обладает объект.

Кроме того, я рекомендую использовать некоторую библиотеку для выполнения HTTP-запросов, таких как AlamoFire и SwiftyJson, для сопоставления вашего ответа JSON с вашим объектом.

Используя библиотеки, которые я упомянул, все ваши вызовы API и табличные функции могут быть такими: func getWeather () {

    let url: String = "http://example.com/api/weather/"

    AFWrapper.requestGETURL(url, success: {
        (JSONResponse) -> Void in

        for item in JSONResponse{
            let weatherList = [WeatherList(fromJson: item.1)]

            for weather in weatherList {
                self. weatherList.append(weather)
            }
        }

        self.tableView.reloadData()
    })
    {
        (error) -> Void in
        print("Error \(error)")
    }




}

А в вашей таблице func:

cell.nameLabel.text =  self.weatherList[indexPath.row].name

Это можетбыть достигнуто с помощью класса AlamoFireWrapper, чтобы сделать сообщение и запрос на получение, подобный этому: AlamoFireWrapper.swift

import UIKit
import Alamofire
import SwiftyJSON

class AFWrapper: NSObject {
    class func requestGETURL(_ strURL: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) {
        Alamofire.request(strURL).responseJSON { (responseObject) -> Void in



            if responseObject.result.isSuccess {
                let resJson = JSON(responseObject.result.value!)
                success(resJson)
            }
            if responseObject.result.isFailure {
                let error : Error = responseObject.result.error!
                failure(error)
            }
        }
    }

    class func requestPOSTURL(_ strURL : String, params : [String : AnyObject]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){

        Alamofire.request(strURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON { (responseObject) -> Void in



            if responseObject.result.isSuccess {
                let resJson = JSON(responseObject.result.value!)
                success(resJson)
            }
            if responseObject.result.isFailure {
                let error : Error = responseObject.result.error!
                failure(error)
            }
        }
    }
}
...