SwiftUI IOS CorePlot发送API数据到图



我不确定如何在我的图中集成我的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 App的示例代码:

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()

}
}
  1. 在检索新数据时调用图上的reloadData以强制图更新。请记住从主队列调用它。

  2. 在plot数据源中,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协议参考,了解其他可用的数据源方法。您的数据源必须包括numberOfRecords(for:)方法和其他方法之一。

最新更新