Swift 如何在viewController上显示加速度计数据

Swift 如何在viewController上显示加速度计数据,swift,accelerometer,viewcontroller,Swift,Accelerometer,Viewcontroller,我用如下方法从陀螺仪和加速度计收集数据: motionManager.startAccelerometerUpdatesToQueue(accelQueue, withHandler: accelHandler) func accelHandler (accelerometerData : CMAccelerometerData!, error : NSError!){ //for saving logging.accelerationX = accelerometerDat

我用如下方法从陀螺仪和加速度计收集数据:

motionManager.startAccelerometerUpdatesToQueue(accelQueue, withHandler: accelHandler)
func accelHandler (accelerometerData : CMAccelerometerData!, error : NSError!){

    //for saving
    logging.accelerationX = accelerometerData.acceleration.x
    logging.accelerationY = accelerometerData.acceleration.y
    logging.accelerationZ = accelerometerData.acceleration.z

    //for displaying
    accelX.text = (NSString(format: "%.5f", accelerometerData.acceleration.x))
    accelY.text = (NSString(format: "%.5f", accelerometerData.acceleration.y))
    accelZ.text = (NSString(format: "%.5f", accelerometerData.acceleration.z))

}
处理程序如下所示:

motionManager.startAccelerometerUpdatesToQueue(accelQueue, withHandler: accelHandler)
func accelHandler (accelerometerData : CMAccelerometerData!, error : NSError!){

    //for saving
    logging.accelerationX = accelerometerData.acceleration.x
    logging.accelerationY = accelerometerData.acceleration.y
    logging.accelerationZ = accelerometerData.acceleration.z

    //for displaying
    accelX.text = (NSString(format: "%.5f", accelerometerData.acceleration.x))
    accelY.text = (NSString(format: "%.5f", accelerometerData.acceleration.y))
    accelZ.text = (NSString(format: "%.5f", accelerometerData.acceleration.z))

}
logging.accelerationX是我自己的变量,accelX.text的类型为@ibx:UILabel!。 处理程序运行可靠,但我没有在相应标签的屏幕上收到数据字符串。
有人有什么建议吗?

我猜问题出在
accelQueue
。您正在调用此队列上的
accelHandler
。这是一个后台队列(我猜)。但是,您正在与界面中的标签<;代码>;accelX。您决不能尝试与后台队列上的接口对话!因此,在执行类似操作之前,您需要跳出到主队列。

进行一些调试。您应该添加一些
println
语句以记录到控制台。尝试记录accelerometerData,以证明处理程序确实被调用。尝试将
accelX
accelX.window
记录到自己的日志中,确认这确实是一个标签,并且标签在界面中。确实,控制台已经输出了吗,因为我发现处理程序工作正常,并且我经常向控制台接收数据。我将尝试您的建议登录accelX和accelX.window!谢谢你的回复,谢谢你的信息。我从来没有想过这件事。那么您认为我应该使用motionManager.startAceleRometerUpdates()方法吗,这就是不带队列的方法?这个队列的东西让我自己很困惑,你可以做任何你想做的事情,但是如果你使用队列的方法,如果你不想陷入严重的线程问题,你必须进入主队列。这一点都不难,但却是必要的。队列方法有优点也有缺点。这意味着你得到了所有的更新。这可以是好的也可以是坏的。通过计时器进行轮询,您处于主线程上,如果可以接受,您可以减少轮询频率。下面是轮询方法的示例:该代码还说明了更新队列方法,但您会注意到我使用主线程进行更新!正是这样,我才不会碰到这种问题。谢谢,太酷了。我将首先研究队列,然后尝试运行您的代码示例。