Ho un gestore di callback registrato che ascolta le modifiche nella Rubrica di iOS. A causa di qualche strana ragione (per la quale è stato archiviato un bug), a volte questa richiamata può essere chiamata più di una volta quando l'app ritorna dallo sfondo. Voglio che il mio gestore di callback esegua la sua logica solo una volta, anche nei casi in cui la richiamata viene chiamata più volte. Questo è come mi registro la richiamata:GCD e callbacks - problema di concorrenza
ABAddressBookRegisterExternalChangeCallback(address_book, adressBookChanged, self);
Ecco come ho strutturato il mio gestore di callback di approfittare di GCD per gestire questa situazione. Purtroppo, non funziona, e GCD non impedisce la logica interna di essere chiamato due volte ...
void adressBookChanged(ABAddressBookRef ab, CFDictionaryRef info, void
*context)
{
NSLog(@"** IN addressBookChanged callback!");
ABAddressBookUnregisterExternalChangeCallback (ab, adressBookChanged, context);
__block BOOL fireOnce = FALSE;
dispatch_queue_t queue;
queue = dispatch_queue_create("com.myapp.abcallback", NULL);
dispatch_async(queue, ^{
if (fireOnce == FALSE) {
fireOnce = TRUE;
dispatch_queue_t queueInternal;
queueInternal = dispatch_queue_create("com.myapp.abcallbackInternal", NULL);
dispatch_async (queueInternal, ^{
NSLog(@"do internal logic");
});
dispatch_release(queueInternal);
}
});
dispatch_release(queue);
}
Sono abbastanza sicuro che questo codice funziona per la ricezione di notifiche multiple, lo sono anche i callback diversi? Generano automaticamente thread diversi, rendendo ogni volta il valore fireOnce FALSE? Come dovrei scrivere questo codice per evitare che più callback chiamino la logica interna più di una volta? Suppongo che potrei usare serrature e/o blocchi sincronizzati per raggiungere questo obiettivo, ma GCD mi è sembrato un modo più pulito per raggiungere questo obiettivo.
Avete un riferimento al bug che è stato archiviato per ottenere la richiamata più volte? –
9301976. È stato chiuso qualche tempo fa a causa di "informazioni insufficienti", che in pratica significa che hanno chiesto un progetto di esempio per riprodurre il problema e non è qualcosa che posso riprodurre per loro a piacimento ... succede con alcuni Exchange misfiring questi avvisi. –
Ok, potrei organizzare e inviare un'applicazione di esempio perché ho l'errore ogni volta che corro. Grazie! –