Apple Swift - 无法从CMPedometer的处理程序中检索数据

时间:2014-06-07 23:39:19

标签: ios swift core-motion

我正在使用一些新的iOS 8 API尝试使用Swift,并且已经尝试了当天最好的部分来获取CMPedometer queryPedometerDataFromDate API以返回处理程序中的任何数据。我相信这是我的错误,与语法有点混淆。

这是我的代码,其中包含对打印内容的评论:

    var ped = CMPedometer()
    var stepsTaken = NSNumber(int: 0)

    println(dateNow) // 2014-06-07 21:23:55 +0000
    println(dateMidnight) // 2014-06-07 00:00:00 +0000

    ped.queryPedometerDataFromDate(dateMidnight, toDate: dateNow, withHandler:{
        data, error in
        println("Test1") // Does not print
        println(error) // Does not print
        stepsTaken = data.numberOfSteps
        })

    println("My Int Value \(stepsTaken)")  // My Int Value 0

5 个答案:

答案 0 :(得分:5)

如果我将CMPedometer定义为类宽常数,它对我的​​CMPedometer queryPedometerDataFromDate起作用:

    let pedometer = CMPedometer()

然后在一个函数中使用:

    self.pedometer.queryPedometerDataFromDate(today, toDate: now, withHandler: ...

答案 1 :(得分:1)

来自Hipster的代码示例。

import CoreMotion

let lengthFormatter = NSLengthFormatter()
let pedometer = CMPedometer()
pedometer.startPedometerUpdatesFromDate(NSDate(), withHandler: { data, error in
if !error {
    println("Steps Taken: \(data.numberOfSteps)")

    var distance = data.distance.doubleValue
    println("Distance: \(lengthFormatter.stringFromMeters(distance))")

    var time = data.endDate.timeIntervalSinceDate(data.startDate)
    var speed = distance / time
    println("Speed: \(lengthFormatter.stringFromMeters(speed)) / s")
}
})

答案 2 :(得分:0)

在玩了几个小时的语法之后,我认为我已经犯了一个菜鸟错误,我尝试了替代API,并发现以下方法可以获取计步器数据:

var ped2 = CMStepCounter()
    ped2.queryStepCountStartingFrom(dateMidnight, to: dateNow, toQueue: NSOperationQueue(), withHandler:{data, error in
        println("Test 2") // "Test 2"
        println(data) // 491 (I really should go for a walk!)
        println(error) // nil
        })

我将向Apple提交雷达,因为它看起来像新API中的错误。 CMStepCounter类也将被弃用于CMPedometer。来自CMStepCounter.h:

NS_CLASS_DEPRECATED_IOS(7_0,8_0,"Use CMPedometer instead")

答案 3 :(得分:0)

您正在查询数据,该数据会转到另一个线程上。在你打电话后继续执行,你的NSNumber仍然是0.当你回来的时候你已经很久以前打印过这个消息了,无法恢复main(0, 0)

答案 4 :(得分:0)

您需要保留对ped变量的引用。类似的东西:

self.ped = CMPedometer();

目前,在调用处理程序之前,你的ped变量超出了范围。