问题
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?
回答1:
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
}
}
回答2:
I thought that all obj-c variables are optionals in swift (since they can be nil) so NSOperationQueue should take a bang thusly:
MotionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue!.currentQueue(),withHandler:{deviceManager,error in println("test")})
Apple documentation here :
https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/#//apple_ref/swift/tdef/CMDeviceMotionHandler
States
The type of block callback for handling device-motion data.
Declaration SWIFT typealias CMDeviceMotionHandler = (CMDeviceMotion!, NSError!) -> Void
来源:https://stackoverflow.com/questions/24114164/motion-manager-is-not-working-in-swift