2011-07-29 6 views
7

У меня есть класс, который управляет сообщениями, поступающими из внешнего аксессуара и идущими на iPad. В инициализации У меня есть следующий код:Почему EAAccessoryDidConnectNotification происходит дважды?

- (id) init 
{ 
    self = [super init]; 
    if (!self) return; 

    [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications]; //we want to hear about accessories connecting and disconnecting 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(accessoryDidConnect:) 
               name:EAAccessoryDidConnectNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(accessoryDidDisconnect:) 
               name:EAAccessoryDidDisconnectNotification 
               object:nil]; 
    ... 
} 

в dealloc У меня есть

- (void) dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:EAAccessoryDidDisconnectNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:EAAccessoryDidConnectNotification object:nil]; 
    [[EAAccessoryManager sharedAccessoryManager] unregisterForLocalNotifications];  
} 

По какой-то причине, когда я подключить внешний аксессуар к IPad в accessoryDidConnect: пожары, за которыми следует accessoryDidDisconnect: с последующим by accessoriesDidConnect:

Я не могу понять, почему я получил бы дополнительное подключение и разъединение. Есть идеи?

ответ

3

Изменить на эту последовательность. Первый регистрационный регистр затем для менеджера

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(accessoryDidConnect:) 
              name:EAAccessoryDidConnectNotification 
              object:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(accessoryDidDisconnect:) 
              name:EAAccessoryDidDisconnectNotification 
              object:nil]; 



[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications]; //we want to hear about accessories connecting and disconnecting 
+0

обновлено и проверьте это –

+0

Ну, похоже, сейчас все работает правильно. Я только получаю сообщение accessDidConnect/accessoriesDidDisconnect один раз сейчас, что хорошо. Однако, похоже, он не связан с порядком, который вызывается registerForLocalNotifications. Но вся документация, которую я когда-либо обнаружил, вызывает вызов регистра в том порядке, который у вас есть. Кажется, я делаю это немного назад. Я думаю, что реальная проблема, возможно, была в моем подсчете ссылок на объект EAAccessory. В последнее время в этой области кода было много изменений кода, но они не были мной. Я поговорил с разработчиком, который их сделал, и ... – Sam

+0

Он не уверен, почему эти уведомления появляются только сейчас. В качестве побочного примечания наш подсчет ссылок был отключен, потому что мы не понимали, что потоки увеличивают количество ссылок на цель, на которую выполняется поток. Во всяком случае, я отмечу это как ответ, хотя я не уверен на 100%, почему это внезапно работает правильно. – Sam

2

Не ответ, но я не могу оставлять комментарии. Я также вижу это двойное уведомление, используя код, указанный в ответе выше. Я также вижу это в примере кода EADemo, предоставленном Apple.

+0

Так меняя порядок наблюдателей NSNotificationCenter и регистрации для EAAcessoryNotification не помогли? Как я сказал выше, я не знаю, почему это внезапно началось. Я дважды проверю, что подключение пожаров только один раз (работает над новым приложением, которое также подключается к другому аксессуару). Я помню, что эта проблема сводила меня с ума. – Sam

+0

+1 за участие в обсуждении об этом – Sam

+0

Право - изменение кодового заказа не повлияло.Я также попытался настроить уведомление в делегате приложения, а не на свой rootviewController (просто потому, что это было что-то попробовать). Затем я попробовал демонстрацию Apple и получил то же самое поведение connect/disconnect/connect. Это не разъем камеры, который у меня есть. У меня также есть мобилизатор midi и получается тот же результат. Единственное, что осталось (что я могу придумать), это то, что мой iPad-коннектор недоволен - или у меня что-то неловкое происходит с моим libusb. Я также работаю с Kinect/OpenNI - и, может быть, я прикрутил что-то вверх по системе. –

5

Рамка eaaccessory будет всегда запускать 2 соединения и 2 отключать уведомления по какой-либо причине. Первая соединительная пара разъемов не будет содержать протокольных строк, вы можете их игнорировать.

0

Ответ на документации EAAccessoryDidConnectNotification

В некоторых случаях уведомление соединения может быть отправлено до аутентификации завершена, в результате пустом protocolStrings массива и последующее сообщение разъединения. Если это произойдет, другое сообщение соединения будет отправлено позже, когда проверка подлинности будет успешной.

Это определенно не должно происходить постоянно, но если вы получили эту подключенную/отсоединенную/подключенную последовательность, проверьте строки протокола. Вероятно, это связано с ошибкой аутентификации.

Смежные вопросы