CMMotionManager - это глобальный ресурс? Что это значит? - PullRequest
1 голос
/ 16 декабря 2011

Я пытаюсь инициализировать CMMotionManager, поэтому запускаю обновления и создаю эталонную матрицу отношений, а затем, когда я нажимаю кнопку на раскадровке, я отображаю другой экран (который находится в контроллере представления) и хочу использовать ссылкуматрица ориентации и другие показания из диспетчера движения, но если я делаю простую проверку, чтобы увидеть, готова ли она, он говорит, что это не так (даже думал, что она была готова на предыдущем экране).

Так что я немного исследовали я наткнулся на некоторые заметки, в которых говорится, что это глобальный ресурс, поэтому можно использовать делегатов или классы, что заставило меня задуматься.

Если я использую делегата, то технически владелец ресурсаделать действие для меня правильно?так что на самом деле это не значит, что он глобальный.

А как насчет классов?я попытался реализовать класс MotionManager, но я все еще не получил никаких показаний на втором экране ... и я просто не инициализировал его снова на новом экране, потому что я не хочу, чтобы несколько экземпляров запускались одновременно.

Чтобы решить мою проблему, я также предполагаю, что мог бы инициализировать ее один раз в основном, сохранить отношение, передать его следующему в переходном процессе и просто повторно инициализировать диспетчер движения, чтобы у меня был только 1 экземпляр(или закрытие старого на экране исчезнет).

Но я не хочу этого, потому что пользователь может сразу щелкнуть по экрану, а диспетчер движений действительно занимает немного времени для инициализации (или вот чтоя заметил).

Заранее спасибо за любую помощь, которую вы можете предоставить.

РЕДАКТИРОВАТЬ:

Хорошо, я попробовал метод делегата, и я все еще не могучитать из диспетчера устройств во втором окне.Что приходит на ум, так это то, что МОЖЕТ быть, когда я иду ко второму окну, xcode автоматически освобождает мой экземпляр диспетчера движения .... (CMMotionManager).

Кто-нибудь знает, как это проверить?

1 Ответ

2 голосов
/ 17 декабря 2011

Надеюсь, я вас правильно понял. Затем я предлагаю использовать одноэлементный шаблон проектирования, заключающий в себе доступ к диспетчеру движений в специализированном классе. Какой-то псевдокод:

MotionHandler.h

@interface MotionHandler {
    CMMotionManager* motionManager;

    + (MotionHandler*) getInstance;
}

MotionHandler.c:

@interface MotionHandler {

    static MotionHandler* instance;

    + (MotionHandler*) getInstance {
        if (instance == nil) {
            instance = [[self alloc] init];
        }
        return instance;
    }

    - (id)init {
        if ((self = [super init])) {
            motionManager = [[CMMotionManager alloc] init];
            // initialise CMMotionManager
        }
    }
}

Таким образом, существует только один экземпляр MotionHandler, который управляет доступом к CMMotionManager. Вы можете получить доступ к своему экземпляру CMMotionManager из любого места с помощью MotionHandler.getInstance.motionManager.

Если вам нужен доступ к CoreMotion из нескольких классов, я рекомендую полную инкапсуляцию доступа CMMotionManager. Это означает, что сделайте его @private и предоставьте такие методы, как getDeviceMotion, setReferenceAttitude, ... Это помогает избежать сложностей, таких как двойной запуск или доступ к CMDeviceMotion перед запуском, и делает более удобным отладку.

...