Swift watchOS 2 - CMSensorDataList

Nar*_*ail 6 core-motion swift watchos-2

简短:我不知道如何从CMSensorRecorder中获取CMenscord的数据后从CMSensorDataList中提取CMRecordedAccelerometerData.Apple尚未提供任何文档.

也许有人暗示我?;)

func startMovementDetection(){
    var accDataList = self.cmSensorRecorder!.accelerometerDataFrom(self.startDate, to: NSDate()) as CMSensorDataList

    CMRecordedAccelerometerData() //that's the class i want to extract from CMSensorDataList
}
Run Code Online (Sandbox Code Playgroud)

好的,问题在这里解决了:Swift中的NSFastEnumeration

使用Swift 3.0,它将更改为:

extension CMSensorDataList: Sequence {
    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

//First make the extension tu use enumerate in the for-in loop
extension CMSensorDataList: SequenceType {
    public func generate() -> NSFastGenerator {
        return NSFastGenerator(self)
    }
}

//Now you can query the recorded data
func printData(){
    let date = NSDate()
    let recorder = CMSensorRecorder()
    let sensorData: CMSensorDataList = recorder.accelerometerDataFromDate(initialDate!, toDate: date)!

    for (index, data) in sensorData.enumerate() {
        print(index, data)
    }
}
Run Code Online (Sandbox Code Playgroud)


mat*_*att 5

这是 Swift 4 方法。首先,您需要通过扩展使 CMSensorDataList 符合 Sequence:

extension CMSensorDataList: Sequence {
    public typealias Iterator = NSFastEnumerationIterator
    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以遍历 CMSensorDataList 以获得 CMRecordedAccelerometerData 实例,每个实例由 atimestamp和 an组成acceleration

let rec = CMSensorRecorder() // and d1 and d2 are Dates
if let list = rec.accelerometerData(from: d1, to: d2) {
    for datum in list {
        if let accdatum = datum as? CMRecordedAccelerometerData {
            let accel = accdatum.acceleration
            let t = accdatum.timestamp
            // do something with data here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)