【问题标题】:SwiftUI IOS CorePlot Send API Data to GraphSwiftUI IOS CorePlot 发送 API 数据到 Graph
【发布时间】:2021-08-07 11:25:35
【问题描述】:

我不确定如何集成要在我的图表中使用的 API 获取代码。是否可以修改我现有的代码以将 API 值相应地发送到我的图表的 X 和 Y 轴?如果是这样,我应该如何在代码放置等方面做到这一点?我希望使用 forEach 函数来解码每个值、电压、电流、温度和时间。以电压、电流和温度为 X 轴,时间为 Y 轴。

当前的 CorePlot 代码:

import Foundation
import SwiftUI
import CorePlot

class CalculatePlotData: ObservableObject {
    
    var plotDataModel: PlotDataClass? = nil
    

    func plotYEqualsX()
    {
        
        //set the Plot Parameters
        plotDataModel!.changingPlotParameters.yMax = 10.0
        plotDataModel!.changingPlotParameters.yMin = -5.0
        plotDataModel!.changingPlotParameters.xMax = 10.0
        plotDataModel!.changingPlotParameters.xMin = -5.0
        plotDataModel!.changingPlotParameters.xLabel = "x"
        plotDataModel!.changingPlotParameters.yLabel = "y"
        plotDataModel!.changingPlotParameters.lineColor = .red()
        plotDataModel!.changingPlotParameters.title = " y = x"
        
        plotDataModel!.zeroData()
        var plotData :[plotDataType] =  []
        
        
        for i in 0 ..< 120 {

            //create x values here

            let x = -2.0 + Double(i) * 0.2

        //create y values here

        let y = x * 8


            let dataPoint: plotDataType = [.X: x, .Y: y]
            plotData.append(contentsOf: [dataPoint])
        
        }
        
        plotDataModel!.appendData(dataPoint: plotData)
        
        
    }
    
    
    func ploteToTheMinusX()
    {
        
        //set the Plot Parameters
        plotDataModel!.changingPlotParameters.yMax = 10
        plotDataModel!.changingPlotParameters.yMin = -3.0
        plotDataModel!.changingPlotParameters.xMax = 10.0
        plotDataModel!.changingPlotParameters.xMin = -3.0
        plotDataModel!.changingPlotParameters.xLabel = "x"
        plotDataModel!.changingPlotParameters.yLabel = "y = exp(-x)"
        plotDataModel!.changingPlotParameters.lineColor = .blue()
        plotDataModel!.changingPlotParameters.title = "exp(-x)"

        plotDataModel!.zeroData()
        var plotData :[plotDataType] =  []
        for i in 0 ..< 60 {

            //create x values here

            let x = -8.0 + Double(i) * 5

        //create y values here

        let y = exp(-x)
            
            let dataPoint: plotDataType = [.X: x, .Y: y]
            plotData.append(contentsOf: [dataPoint])
        }
        
        plotDataModel!.appendData(dataPoint: plotData)
        
        return
    }
    
}

获取 API 数据到 IOS 应用的示例代码:

import Foundation

struct datamainjsonlatest: Codable, Identifiable {
    var id: String
    var times: String
    var Voltage: String
    var Current: String
    var Temperature: String
}


class Api : ObservableObject{
    @Published var datamainjsonlatests = [datamainjsonlatest]()
    
    func loadData(completion:@escaping ([datamainjsonlatest]) -> ()) {
        guard let url = URL(string: "https://dcmicrogridiep.000webhostapp.com/datamainlatestjson.php") else {
            print("Invalid url...")
            return
        }

        URLSession.shared.dataTask(with: url) { data, response, error in
            let datamainjsonlatests = try! JSONDecoder().decode([datamainjsonlatest].self, from: data!)
            print(datamainjsonlatests)
            DispatchQueue.main.async {
                completion(datamainjsonlatests)
            }
        }.resume()
        
    }
}

【问题讨论】:

    标签: ios swiftui core-plot rest


    【解决方案1】:
    1. 每当您检索新数据以强制更新图表时,请在图表上调用reloadData。记得从主队列中调用它。

    2. 在绘图数据源中,numberOfRecords(for:) 方法应返回 datamainjsonlatests.count。如果您要过滤数据范围以获得更好的绘图性能,请相应地调整此计数。

    3. 这是来自 Core Plot 示例应用程序之一的数据源方法:

        func number(for plot: CPTPlot, field: UInt, record: UInt) -> Any?
        {
            switch CPTScatterPlotField(rawValue: Int(field))! {
            case .X:
                return (oneDay * Double(record)) as NSNumber
                
            case .Y:
                return self.plotData[Int(record)] as NSNumber
    
            @unknown default:
                return nil
            }
        }
    

    .X.Y 大小写更改为datamainjsonlatests 中的数据所需的任何转换。如果在数组中提供数据更容易,请参阅CPTPlotDataSource Protocol Reference 了解其他可用的数据源方法。您的数据源必须包含 numberOfRecords(for:) 方法和其他方法之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多