2011-07-29 16 views
7

Ho una classe che gestisce i messaggi che arrivano da un accessorio esterno a un iPad. Nella init Ho il codice seguente:Perché EAAccessoryDidConnectNotification si verifica due volte?

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

in dealloc ho

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

Per qualche ragione, quando si collega l'accessorio esterno per l'iPad l'accessoryDidConnect: incendi seguiti da un accessoryDidDisconnect: seguita by accessoryDidConnect:

Non riesco a capire perché mi piacerebbe avere una connessione in più e disconnettere. Qualche idea?

risposta

3

Passare a questa sequenza. Primo registro notifica poi per direttore

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

aggiornato e verificare questo –

+0

Bene, le cose sembrano funzionare correttamente ora. Ricevo solo un messaggio accessorioDidConnect/accessoryDidDisconnect una volta, il che è positivo. Tuttavia, sembra non essere correlato all'ordine in cui viene registrato registerForLocalNotifications. Ma tutta la documentazione che abbia mai trovato fa la chiamata al registro nell'ordine che hai qui. Mi sembra di fare un po 'indietro. Penso che il vero problema potrebbe essere stato nel mio conteggio di riferimento dell'oggetto EAAccessory. Ultimamente ci sono state molte modifiche al codice in quest'area di codice, ma non erano da me. Ho parlato con il dev che li ha fatti, e ... – Sam

+0

Non è sicuro del motivo per cui queste notifiche arrivano solo una volta. Come nota a margine, il nostro conteggio dei riferimenti era disattivato perché non ci siamo resi conto che il threading aumentava il conteggio dei riferimenti del target su cui il thread scorre. Comunque, segnerò questa come risposta anche se non sono sicuro al 100% sul perché tutto funzioni all'improvviso. – Sam

2

Non una risposta, ma non posso pubblicare un commento. Vedo anche questa doppia notifica utilizzando il codice fornito nella risposta sopra. Lo vedo anche nel codice di esempio EADemo fornito da Apple.

+0

Quindi, cambiando l'ordine degli osservatori di NSNotificationCenter e la registrazione per EAAcessoryNotification non ha aiutato? Come ho detto sopra, non sono sicuro del perché all'improvviso abbia iniziato a funzionare correttamente. Verificherò due volte che la connessione si attiva una sola volta (lavorando su una nuova app che si collega anche a un altro accessorio). Ricordo che questo problema mi ha fatto impazzire prima. – Sam

+0

+1 per partecipare alla discussione su questo – Sam

+0

La modifica corretta dell'ordine del codice non ha fatto la differenza.Ho anche provato a impostare la notifica nel delegato dell'app anziché in rootviewController (solo perché era qualcosa da provare). Poi ho provato la demo di Apple e ho avuto lo stesso comportamento di connessione/disconnessione/connessione. Non è il connettore della fotocamera che ho - ho anche un dispositivo midi mobilizer e ottengo lo stesso risultato. L'unica cosa rimasta (che mi viene in mente) è che il mio connettore per iPad è schivato - o ho qualcosa di strano che sta succedendo con la mia libusb. Sto anche lavorando con Kinect/OpenNI - e forse ho rovinato qualcosa in senso sistemico. –

5

la struttura semplice scatterà sempre 2 connessioni e 2 notifiche di disconnessione per qualche motivo. La prima coppia di disconnessione di connessione non avrà stringhe di protocollo, è possibile ignorarle.

0

La risposta è sulla documentazione di EAAccessoryDidConnectNotification

In alcuni casi, la notifica di connessione può essere inviata prima autenticazione è completata, con un conseguente protocolStrings array vuoto e un messaggio di disconnessione successiva. Se ciò accade, un altro messaggio di connessione viene inviato in seguito, quando l'autenticazione ha esito positivo.

Non è assolutamente previsto che accada tutto il tempo, ma se si riceve questa sequenza connessa/disconnessa/connessa, controllare le stringhe del protocollo. Probabilmente è legato al fallimento dell'autenticazione.