我正在使用一些新的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
答案 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变量超出了范围。