Почему мой сохраненный экземпляр CMAttitude становится нулевым после того, как я вызываю stopDeviceMotionUpdates и startDeviceMotionUpdates? - PullRequest
0 голосов
/ 23 июня 2011

У меня есть класс с иваром:

@interface myCoolClass:NSObject 
{
   CMAttitude *referenceAttitude;
}

В моей реализации есть следующие селекторы:

- (void) startTrackingMotion
{
    if (motionManager == nil) {
        motionManager = [[CMMotionManager alloc] init];
        motionManager.accelerometerUpdateInterval = 0.01;
        motionManager.deviceMotionUpdateInterval = 0.01;
        referenceAttitude = [motionManager.deviceMotion.attitude retain];
    }

    [motionManager startDeviceMotionUpdates];

    if (referenceAttitude == nil) {
        CMDeviceMotion *dm = motionManager.deviceMotion;
        referenceAttitude = [dm.attitude retain];
    }
}

- (void) stopTrackingMotion
{
    [motionManager stopDeviceMotionUpdates];
}

Я хочу взять referenceAttitude, когда я запускаю менеджер движения и используюэто в течение жизни приложения.Иногда мне нужно отслеживать движение, а иногда нет.

Вот поток приложения:

  1. вызов startTrackingMotion, поскольку я готов к движению
  2. referenceAttitudeостается сохраненным, и я использую его для отслеживания движения
  3. Я вызываю stopTrackingMotion, так как собираюсь делать не движущиеся вещи
  4. приложение делает другие вещи
  5. Я снова вызываю startTrackingMotionтак как я снова готов к движению

На этом этапе, проходя по коду, я перехожу цикл «if (motionManager == nil)», поскольку он все еще там.Однако каждый раз, когда речь заходит о цикле «if (referenceAttitude == nil)», оператор if принимает значение true.

Не правильно ли я его сохранил?Вызывает ли StopDeviceMotionUpdates мой экземпляр?

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Я не думаю, что вы даете достаточно времени, чтобы motionManager обновился.

Вы должны получить referenceAttitude после первого тика deviceMotionUpdateInterval (0.1).

0 голосов
/ 27 июня 2011

Вызов stopDeviceMotionUpdates не обнуляет вашу переменную referenceAttitude. Какую версию XCode вы используете и на каком устройстве вы его используете?

Вы проверили, что в данный момент в коде установлен допустимый экземпляр CMAttitude?

referenceAttitude = [motionManager.deviceMotion.attitude retain];

Если вы выполните po [dm attitude] в отладчике в блоке referenceAttitude == nil, что вы получите?

...