2014-06-09 19 views
9

Sto provando a utilizzare Motion Manager in Swift ma il log all'interno del mio blocco di aggiornamento non viene mai stampato.Motion Manager non funziona in Swift

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  

La mia implementazione Objective-C funziona correttamente. Qualcuno sa perché il mio blocco di aggiornamento non viene chiamato?

risposta

22

Questo perché l'istanza del gestore di movimento viene espulsa quando il metodo restituisce. Dovresti creare una proprietà sulla tua classe per contenere il gestore del movimento. Inoltre, sembra che tu stia cambiando solo il numero accelerometerUpdateInterval della mangiatoia e quindi monitorando le modifiche al movimento del dispositivo. Si dovrebbe invece impostare la proprietà deviceMotionUpdateInterval.

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 
    } 
} 
0

ho pensato che tutte le variabili obj-c sono optionals a Swift (in quanto possono essere pari a zero), in modo NSOperationQueue dovrebbe prendere un botto questa convenzione:

MotionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue!.currentQueue(),withHandler:{deviceManager,error in println("test")}) 

di Apple documentazione qui:

https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/#//apple_ref/swift/tdef/CMDeviceMotionHandler

Stati

Il tipo o f Richiamate il blocco per la gestione dei dati di movimento del dispositivo.

Dichiarazione SWIFT typealias CMDeviceMotionHandler = (CMDeviceMotion !, NSError!) -> Void