2011-07-29 26 views
7

Tengo una clase que gestiona los mensajes que provienen de un accesorio externo de un iPad. En el init Tengo el siguiente código:¿Por qué EAAccessoryDidConnectNotification se produce dos veces?

- (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]; 
    ... 
} 

en dealloc tengo

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

Por alguna razón, cuando conecto el accesorio externo a la IPAD el accessoryDidConnect: incendios seguidos de un accessoryDidDisconnect: seguido por accessoryDidConnect:

No entiendo por qué me gustaría conectarme y desconectarme. ¿Algunas ideas?

Respuesta

3

Cambie a esta secuencia. Primera notificación regístrese luego para el administrador

[[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

actualizado y compruébalo –

+0

Bueno, las cosas parecen estar funcionando correctamente ahora. Solo recibo un mensaje de accesorioDidConnect/accessoryDidDisconnect una vez, lo cual es bueno. Sin embargo, parece no estar relacionado con el orden en que se llama registerForLocalNotifications. Pero, toda la documentación que he encontrado hace la llamada de registro en el orden que tiene aquí. Parece que lo estoy haciendo un poco al revés. Creo que el verdadero problema pudo haber sido en mi recuento de referencias del objeto EAAccessory. Ha habido muchos cambios de código últimamente en esta área de código, pero no fueron por mí. Hablé con el desarrollador que los hizo, y ... – Sam

+0

No está seguro de por qué esas notificaciones solo están llegando una vez. Como nota al margen, nuestro recuento de referencias no se realizó porque no nos dimos cuenta de que el enhebrado aumentaba el recuento de referencias del objetivo en el que se ejecuta el hilo. De todos modos, marcaré esto como la respuesta a pesar de que no estoy 100% seguro de por qué esto de repente funciona bien. – Sam

2

No hay respuesta, pero no puedo publicar un comentario. También veo esta doble notificación usando el código proporcionado en la respuesta anterior. También lo estoy viendo en el código de muestra de EADemo proporcionado por Apple.

+0

Cambiando así el orden de los observadores NSNotificationCenter y registrarse para EAAcessoryNotification no ayudó? Como dije antes, no estoy seguro de por qué de repente esto comenzó a funcionar correctamente. Verificará que conecte los fuegos solo una vez (trabajando en una nueva aplicación que también se conecta a un accesorio diferente). Recuerdo que este problema me volvía loco antes. – Sam

+0

+1 por participar en la discusión sobre este – Sam

+0

Derecha - cambiar el orden del código no hizo la diferencia.También intenté configurar la notificación en el delegado de la aplicación en lugar de en mi rootviewController (solo porque era algo para probar). Luego probé la demostración de Apple y obtuve el mismo comportamiento de conexión/desconexión/conexión. No es el conector de la cámara que tengo; también tengo un dispositivo movilizador midi y obtengo el mismo resultado. Lo único que queda (lo que puedo pensar) es que mi conector para iPad es obsoleto, o tengo algo que hacer con mi libusb. También estoy trabajando con Kinect/OpenNI, y tal vez cometí un error en el sistema. –

5

el marco de eaaccessory siempre activará 2 notificaciones de conexión y 2 de desconexión por algún motivo. El primer par de desconexión de conexión no tendrá cadenas de protocolo, puede ignorarlas.

0

La respuesta está en la documentación de EAAccessoryDidConnectNotification

En algunos casos, la notificación de conexión puede ser enviada antes de la autenticación se ha completado, lo que resulta en una matriz protocolStrings vacío y un mensaje de desconexión subsiguiente. Si esto sucede, se enviará otro mensaje de conexión más tarde, cuando la autenticación sea exitosa.

Definitivamente no se supone que suceda todo el tiempo, pero si recibe esta secuencia conectada/desconectada/conectada, compruebe las cadenas de protocolo. Probablemente esté relacionado con la falla de autenticación.

Cuestiones relacionadas