Swift iOS Chart с данными из базы данных - PullRequest
0 голосов
/ 29 сентября 2019

В настоящее время я учусь подключаться к базе данных SQL и отображать информацию. Я также пытаюсь захватить замыкания одновременно с построением графиков. Пока я могу успешно извлечь данные из базы данных, а затем отобразить информацию в UITableViewController.

У меня есть простой UIViewController с UIView для отображения данных. До сих пор моя проблема в том, что все данные извлекаются из замыкания, но затем, когда я что-то делаю вне замыкания, нет данных.

 @IBOutlet weak var lineChartView: LineChartView!

    var sensorReadings: [SensorReadings] = []

    var lineChartEntry = [ChartDataEntry]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "replaced with actual URL ")

        URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
            guard let data = data, error == nil else { print(error!); return }

            if error != nil {
                print("Datatask Error: ", error!)
            } else {
                do {
                    if let sensorData = try JSONSerialization.jsonObject(with: data, options: []) as? [[String:String]] {
                        for sData in sensorData {
                            let dataId = sData["dataid"] ?? ""
                            let readingTime = sData["readingtime"] ?? ""
                            let sensorId = sData["sensorid"] ?? ""
                            let reading = sData["reading"] ?? ""

                            self.sensorReadings.append(SensorReadings(dataId: dataId, readingTime: readingTime, sensorId: sensorId, reading: reading))
                        }
                    }                    
                } catch {
                    print("Serialization Error ", error)
                }
            }
            }).resume()

        // Creates an array of strings to hold reading values
        var tempArray: [String] = []

        // Loops through the downloadaed data
        // Adds each of the readings to tempArray
        for reading in self.sensorReadings {
            tempArray.append(reading.reading)
        }

        // Convert String to Double
        let doublesArray = tempArray.compactMap(Double.init)

        // Chart Information
        for i in 0..<doublesArray.count {
            let value = ChartDataEntry(x: Double(i), y: doublesArray[i])

            self.lineChartEntry.append(value)
        }

        let line = LineChartDataSet(entries: self.lineChartEntry, label: "Number")
        line.colors = [NSUIColor.blue]

        let chartData = LineChartData()
        chartData.addDataSet(line)

        self.lineChartView.data = chartData

        self.lineChartView.chartDescription?.text = "Data"

    }

Во-первых, я на правильном пути с получением данных из базы данных? Тогда как же я могу обновить диаграмму с информацией? Как вернуть информацию из URLSession? Или есть способ, которым я могу обновить диаграмму, как я делаю в `UITableView1:

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

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Я вижу проблему здесь. Проблема в том, что у вас есть код для обновления таблицы в viewDidLoad сразу после вызова API с помощью URLSession. Вам нужно дождаться ответа от API. Попробуйте следующее

 @IBOutlet weak var lineChartView: LineChartView!

var sensorReadings: [SensorReadings] = []

var lineChartEntry = [ChartDataEntry]()

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: "replaced with actual URL ")

    URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
        guard let data = data, error == nil else { print(error!); return }

        if error != nil {
            print("Datatask Error: ", error!)
        } else {
            do {
                if let sensorData = try JSONSerialization.jsonObject(with: data, options: []) as? [[String:String]] {
                    for sData in sensorData {
                        let dataId = sData["dataid"] ?? ""
                        let readingTime = sData["readingtime"] ?? ""
                        let sensorId = sData["sensorid"] ?? ""
                        let reading = sData["reading"] ?? ""

                        self.sensorReadings.append(SensorReadings(dataId: dataId, readingTime: readingTime, sensorId: sensorId, reading: reading))
                        self.updateChart()
                    }
                }                    
            } catch {
                print("Serialization Error ", error)
            }
        }
        }).resume()
}
fun updateChart()
{
    // Creates an array of strings to hold reading values
    var tempArray: [String] = []

    // Loops through the downloadaed data
    // Adds each of the readings to tempArray
    for reading in self.sensorReadings {
        tempArray.append(reading.reading)
    }

    // Convert String to Double
    let doublesArray = tempArray.compactMap(Double.init)

    // Chart Information
    for i in 0..<doublesArray.count {
        let value = ChartDataEntry(x: Double(i), y: doublesArray[i])

        self.lineChartEntry.append(value)
    }
    let line = LineChartDataSet(entries: self.lineChartEntry, label: "Number")
    line.colors = [NSUIColor.blue]
    let chartData = LineChartData()
    chartData.addDataSet(line)
    self.lineChartView.data = chartData
    self.lineChartView.chartDescription?.text = "Data" }

Дайте мне знать, если это работает. Также есть цикл сохранения. Пользователь [слабый я] внутри замыкания.

0 голосов
/ 29 сентября 2019

После прочтения этой статьи: https://stablekernel.com/how-to-prevent-memory-leaks-in-swift-closures/

Я получил немного больше понимания. Поскольку я не знал, что такое цикл сохранения. Все еще собираюсь прочитать, но используя ответ Шоана и подправив:

DispatchQueue.main.async {
    self.updateChart()
}

Это сработало прекрасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...