Swift watchOS 2 - CMSensorDataList

9

简述:我不知道如何从CMSensorRecorder获取CMSensorDataList后提取CMRecordedAccelerometerData。目前苹果还没有提供相关文档。

也许有人能给我一些提示?;)

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

    CMRecordedAccelerometerData() //that's the class i want to extract from CMSensorDataList
}

好的,这个问题可以通过这个链接解决:NSFastEnumeration in Swift

在Swift 3.0中,它改成了:

extension CMSensorDataList: Sequence {
    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }
}

你有任何代码片段吗? - Biswajit_86
3个回答

5
这里是一个Swift 4的方法。首先,您需要通过扩展使CMSensorDataList符合Sequence:
extension CMSensorDataList: Sequence {
    public typealias Iterator = NSFastEnumerationIterator
    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }
}

现在,您可以迭代CMSensorDataList以获取CMRecordedAccelerometerData实例,每个实例包括一个timestamp和一个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
        }
    }
}

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

3

以下是Marcus在Swift 4中的答案:

//First make the extension to use enumerate in the for-in loop
extension CMSensorDataList: Sequence {
    public typealias Iterator = NSFastEnumerationIterator

    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }
}

//Now you can query the recorded data
func printData(){
    let date = Date()
    let recorder = CMSensorRecorder()
      let accelerometerData = recorder.accelerometerData(from: startDate, to: endDate)

     for (index, data) in (accelerometerData?.enumerated())! {
                    print(index, data)
      }
}

Swift 4 中没有 SequenceType。这段代码无法编译。 - matt
只是一个序列,参见修改后的答案。 - GarySabo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接