1
import UIKit
import CoreBluetooth
import SciChart

let maestroBrainDataCBUUID = CBUUID(string: "49535343-1E4D-4BD9-BA61-23C647249616")

class HRMViewController: UIViewController {
    var sciChartSurface: SCIChartSurface?
    var wave:Double! = 0.0

    var lineDataSeries: SCIXyDataSeries!
    var scatterDataSeries: SCIXyDataSeries!

    var lineRenderableSeries: SCIFastLineRenderableSeries!
    var scatterRenderableSeries: SCIXyScatterRenderableSeries!

    var timer: Timer?
    var phase = 0.0
    var i = 0

    @IBOutlet weak var brainRateLabel: UILabel!

wave是蓝牙数据实时的含义。

    var centralManager: CBCentralManager!
    var maestroPeripheral:CBPeripheral!

    override func viewDidLoad() {
        super.viewDidLoad()

        <elide>
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if nil == timer{
            timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: updatingDataPoints)
        }
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if nil != timer{
            timer?.invalidate()
            timer = nil
        }
    }

    func updatingDataPoints(timer:Timer){
        i += 1
        if wave != nil {
            lineDataSeries.appendX(SCIGeneric(i), y: SCIGeneric((wave)))
        }

        phase += 0.01

        sciChartSurface?.zoomExtents()
        sciChartSurface?.invalidateElement()
    }

    func createDataSeries(){
        lineDataSeries = SCIXyDataSeries(xType: .double, yType: .double)
        lineDataSeries.fifoCapacity = 500
        lineDataSeries.seriesName = "line series"

        for i in 0...500{
            lineDataSeries.appendX(SCIGeneric(i), y: SCIGeneric(wave))
        }

        i = Int(lineDataSeries.count())
    }

我尝试使用 sci-chart 框架制作实时图表。但是,如果我尝试运行编码,则会收到错误消息:

“在展开可选值时意外发现 nil”

如何解决这个问题呢?有没有和我一样经历的TT?

extension HRMViewController: CBCentralManagerDelegate {
  func centralManagerDidUpdateState(_ central: CBCentralManager) {
    switch central.state {

    <elide>
  }
}

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic,
                  error: Error?) {
    switch characteristic.uuid {
      case maestroBrainDataCBUUID:
        wave = Double(brainData(from: characteristic))*3.3/65536

      default:
      print("Unhandled Characteristic UUID: \(characteristic.uuid)")
    }
  }

我用它来绘制波浪值,但是当我去掉选项时出现错误。所以如果我们用if来让折线图出现,如果不是nil的话,那就报错了,我试了好几次,都报了runtime error。我应该怎么办?

4

1 回答 1

1

我认为这可能是由于您的代码中缺少 createDataSeries() 调用引起的。因此,当调用 updateDataPoints() 时 lineDataSeries 实例未初始化。

尝试在调用 updateDataPoints() 之前添加 createDataSeries() 调用,或者至少在 updateDataPoints() 中添加对 lineDataSeries 实例的 nil 检查。

于 2018-05-07T08:37:02.323 回答