Как отобразить данные JSON в линейном графике с помощью Swift - PullRequest
0 голосов
/ 01 апреля 2019

Я новичок в приложении ios, пишу простое приложение, которое показывает данные API JSON.Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу отобразить данные json в представлении, используя линейный график для визуализации

Прежде всего, это мои данные json.

{
TH_5min: [
{
Data: "2019-02-23T00:00:00",
Time: "11:00:00",
XTP_A: 10.5, //temperature 1
XHP_A: 11.5, //humidity 1
XTP_B: 33.5,
XHP_B: 44.6,
XTP_C: 88.9,
XHP_C: 66.6,
XTP_D: 77.9,
XHP_D: 99.6,
XTP_E: 87.87,
XHP_E: 66.66
},
{
Data: "2019-02-23T00:00:00",
Time: "11:05:00",
XTP_A: 55.2,  //temperature 1
XHP_A: 44.3,  //humidity 1
XTP_B: 66.6,
XHP_B: 77.87,
XTP_C: 87.77,
XHP_C: 87.87,
XTP_D: 8.87,
XHP_D: 78.78,
XTP_E: 87.78,
XHP_E: 87.87
}
]
}

В этом формате я читаю данные json и сохраняю их, используя код swift

private var th_5mins = [Th_5min]() 
@objc func getlatestTh_5min(){
        guard let th_5minUrl = URL(string: kivaLoanURl) else{
            return
        }
        let request = URLRequest(url: th_5minUrl)
        let task = URLSession.shared.dataTask(with: request, completionHandler: {(data,response,error) -> Void in
            if let error = error {
                print(error)
                return
            }
            if let data = data {
                self.th_5mins = self.pardrJsonData(data: data)
            }
        })
        task.resume()
    }
    func pardrJsonData(data: Data) -> [Th_5min]{
        var th_5mins = [Th_5min]()
        do {
            let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
            let jsonTh_5mins = jsonResult?["TH_5min"] as! [AnyObject]
            for jsonTh_5min in jsonTh_5mins{
                var th_5min = Th_5min()
                th_5min.Data = jsonTh_5min["Data"] as! String
                th_5min.Time = jsonTh_5min["Time"] as! String
                th_5min.XTP_A = jsonTh_5min["XTP_A"] as! Double
                th_5min.XHP_A = jsonTh_5min["XHP_A"] as! Double
                th_5mins.append(th_5min)
            }        }catch{
                print(error)
        }
        return th_5mins
    }
}

. Вот моя текущая реализация метода линейных графиков, используя код swift

override func viewDidLoad() {
        super.viewDidLoad()
        getlatestTh_5min()
        //
        chartView = LineChartView()
        chartView.frame = CGRect(x: 20, y: 80, width: self.view.bounds.width - 40,height: 300)
        self.view.addSubview(chartView)
        //Generate data for the first line chart
        var dataEntries1 = [ChartDataEntry]()
        for i in 0...5 {
            let y = Th_5min().XTP_A
            let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
            dataEntries1.append(entry)
        }
        let chartDataSet1 = LineChartDataSet(entries: dataEntries1, label: "溫度")
        //Generate data for the second line chart
        var dataEntries2 = [ChartDataEntry]()
        for i in 0..<8 {
            let y = arc4random()%100
            let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
            dataEntries2.append(entry)
        }
        let chartDataSet2 = LineChartDataSet(entries: dataEntries2, label: "濕度")
        //
        let chartData = LineChartData(dataSets: [chartDataSet1, chartDataSet2])
        //show line chart data
        chartView.data = chartData
    }

Текущий результат:только вторая строка успешно отображается, но это не те данные, которые я хочу.У меня есть только случайное значение для отображения данных.Первый, независимо от того, как вы пытаетесь, данные JSON никогда не теряются в диаграмме.Я хочу это реализовать.Все данные, полученные с помощью API (температура 1, влажность 1), выводятся на линейную диаграмму, одна показывает температуру, другая показывает влажность, а время json отображается в верхней части оси X, но как бросить jsonна график в настоящее время я не знаю, что делать, пожалуйста, помогите мне!

1 Ответ

1 голос
/ 01 апреля 2019

Здесь есть две очевидные проблемы.

  1. В начале viewDidLoad() вы вызываете функцию для загрузки данных JSON.Затем вы сразу же попытаетесь построить данные.Это не будет работать, так как загрузка данных JSON является асинхронным процессом и не завершится, когда функция вернется.В это время у вас не будет доступа к загруженным данным.Чтобы исправить это, переместите код графика из viewDidLoad() в отдельную функцию и вызовите эту функцию после загрузки и анализа данных (т. Е. В конце pardrJsonData).
  2. Код построения не используетзагруженный проанализированный JSON, который вы создаете в pardrJsonData.Эта функция заполняет массив th_5mins, но тогда она не используется.Код графика включает let y = Th_5min().XTP_A, но это создает новый экземпляр значения и отображает его значение XTP_A, которое инициализируется по умолчанию.Замените эту строку на let y = th_5mins[i].XTP_A.Однако я бы изменил предел цикла с жестко закодированного 5 на for i in 0..<th_5mins.count.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...