繁体   English   中英

如何重新加载来自Swift中外部API的Linechart数据?

[英]How to reload Linechart Data which is coming from external API in Swift?

我在一个iOS应用程序中工作,在该应用程序中我从API检索数据并将其显示在LineChart中。 数据将作为JSON检索。 我还显示了正确显示数据的表格视图。 但是在LineChart的情况下,我遇到了问题。 由于数据来自本质上是异步的Alamofire请求,因此将在数据到达之前绘制图表。 谁能在这方面建议我最好的行动方案。

 // // ICLFundPerformanceChart.swift // iVest // // Created by Rashed on 16/9/19. // Copyright © 2019 Impress Capital Limited. All rights reserved. // import UIKit import Charts import Alamofire import SwiftyJSON protocol FundPerformanceChartToFundPerformance { func backToFundPerformanceFromFundPerformanceChart() } class ICLFundPerformanceChart: UIViewController { var delegate : FundPerformanceChartToFundPerformance! @IBOutlet weak var backImageButton: UIButton! @IBOutlet weak var lineChartView: LineChartView! var navId : Int! var url : String! var listOfNAV = [BalancedFundNav]() var navChartLevel = [String]() var navChartData = [Double]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. backImageButton.setImage(UIImage(named: "keyboard-left-arrow-button"), for: UIControl.State.normal) urlSelector(navTag: navId) loadNavData(url: url) loadChartData() // Do any additional setup after loading the view. //print(navId) } @IBAction func backButtonPressed(_ sender: Any) { delegate?.backToFundPerformanceFromFundPerformanceChart() self.dismiss(animated: true, completion: nil) } func urlSelector(navTag : Int){ let urlGenerator = UrlGenerator() url = urlGenerator.generateURL(navId: navTag) } func loadNavData(url : String){ Alamofire.request(url, method: .post).responseJSON{ response in if response.result.isSuccess{ print("Response Success") let navDataJSON : JSON = JSON(response.result.value!) self.updateChartData(json: navDataJSON) }else{ } } } func updateChartData(json : JSON){ print("Updating data") guard let dataDict = json.array, !dataDict.isEmpty else { return } var navDataJSONArray = [JSON]() navDataJSONArray = dataDict for nav in navDataJSONArray{ //print(nav["fund_nav_buy"]) let navObject : BalancedFundNav = BalancedFundNav(navAsOnDate: nav["nav_as_on_date"].string!, navAtMarket: nav["fund_nav_market"].double!, navAtSell: nav["fund_nav_sell"].double!, navAtCost: nav["fund_nav_cost"].double!, navValidAt: nav["fund_nav_validity"].string!) self.listOfNAV.append(navObject) print(navObject.navAsOnDate!) } //listOfNAV = listOfNAV.reversed() print("data updated") //lineChartView.reloadInputViews() lineChartView.data?.notifyDataChanged() lineChartView.notifyDataSetChanged() } func loadChartData(){ for nav in listOfNAV{ navChartLevel.append(nav.navAsOnDate) navChartData.append(nav.navAtMarket) } setChart(dataPoints: navChartLevel, values: navChartData) } func setChart (dataPoints : [String], values : [Double]){ var dataEntries : [ChartDataEntry] = [] for i in 0..<dataPoints.count { let dataEntry = ChartDataEntry(x: Double(i), y: values[i]) dataEntries.append(dataEntry) } var colors : [UIColor] = [] for i in 0...dataPoints.count{ let red = Double(arc4random_uniform(256)) let green = Double(arc4random_uniform(256)) let blue = Double(arc4random_uniform(256)) let color = UIColor(red: CGFloat(red/255), green: CGFloat(green/255), blue: CGFloat(blue/255), alpha: 1.0) colors.append(color) } let lineChartDataSet = LineChartDataSet(entries: dataEntries, label: "NAV") lineChartDataSet.colors = colors let lineChartData = LineChartData(dataSets: dataPoints as? [IChartDataSet]) lineChartView.data = lineChartData } } 

感谢您在这方面的支持。

编辑:

我以不同的方式完成了任务。 我创建了一个单例类,该类将存储所需的值,并且图表在加载时获取了数据。 但是对我来说,这不是最好的解决方案。 因此,请等待某人的友好答复。

在viewDidLoad()方法中,已调用loadChartData()。 此方法包含折线图的数据处理,但是目前我们还没有任何数据。 在loadNavData(url:String)方法中获取数据后,应调用loadChartData()。

查看加载方法应该看起来像

override func viewDidLoad() {

        super.viewDidLoad()
        // Do any additional setup after loading the view.
        backImageButton.setImage(UIImage(named: "keyboard-left-arrow-button"), for: UIControl.State.normal)
        urlSelector(navTag: navId)
        loadNavData(url: url)

        // Do any additional setup after loading the view.
        //print(navId)

loadNavData(url:String)方法应该看起来像

func loadNavData(url : String){
        Alamofire.request(url, method: .post).responseJSON{
            response in
            if response.result.isSuccess{

                print("Response Success")

                let navDataJSON : JSON = JSON(response.result.value!)
                loadChartData()
                self.updateChartData(json: navDataJSON)


            }else{

            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM