Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Motion Manager is not working in Swift

I am try to use motion manager in Swift but the log inside my update block never prints.

    var motionManager: CMMotionManager = CMMotionManager()
    motionManager.accelerometerUpdateInterval = 0.01
    println(motionManager.deviceMotionAvailable) // print true
    println(motionManager.deviceMotionActive) // print false
    motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:{
        deviceManager, error in
        println("Test") // no print
    })

    println(motionManager.deviceMotionActive) // print false     

My Objective-C implementation works fine. Does anyone know why my update block isn't being called?

like image 742
Naitian Avatar asked Jun 09 '14 05:06

Naitian


1 Answers

That's because the motion manager instance is being thrown out when the method returns. You should make a property on your class to contain the motion manager. Additionally, it looks like you were only changing the manger's accelerometerUpdateInterval and then monitoring device motion changes. You should set the deviceMotionUpdateInterval property instead.

import CoreMotion

class ViewController: UIViewController {
    let motionManager = CMMotionManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        motionManager.deviceMotionUpdateInterval = 0.01
        motionManager.startDeviceMotionUpdates(to: OperationQueue.current!) { deviceManager, error in
            print("Test") // no print
        }

        print(motionManager.isDeviceMotionActive) // print false
    }
}
like image 124
Mick MacCallum Avatar answered Oct 04 '22 19:10

Mick MacCallum