Tengo un controlador de devolución de llamada registrado que escucha los cambios en la libreta de direcciones de iOS. Debido a alguna razón extraña (por la que se ha archivado un error), esta devolución de llamada a veces se puede llamar más de una vez cuando la aplicación vuelve del fondo. Quiero que mi manejador de devolución de llamada ejecute su lógica solo una vez, incluso en los casos en que se llame a la devolución de llamada varias veces. Así es como me registro la devolución de llamada:GCD y devoluciones de llamada: problema de concurrencia
ABAddressBookRegisterExternalChangeCallback(address_book, adressBookChanged, self);
así es como Estructuré mi manejador de devolución de llamada para aprovechar GCD para manejar esto. Por desgracia, no está funcionando, y GCD no impide que la lógica interna que se llama dos veces ...
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);
}
Estoy bastante seguro de que este código funciona para recibir varias notificaciones, por lo que son devoluciones de llamada diferente? ¿Engendran diferentes hilos automáticamente, haciendo que el valor de fireOnce sea FALSO cada vez? ¿Cómo debo escribir este código para evitar que las devoluciones de llamada múltiples llamen a la lógica interna más de una vez? Supongo que podría usar bloqueos y/o bloques sincronizados para lograr esto, pero GCD parecía una forma más limpia de lograr esto.
¿Tiene alguna referencia al error que se ha presentado sobre cómo obtener la devolución de llamada varias veces? –
9301976. Se cerró hace un tiempo debido a "información insuficiente", lo que básicamente significa que pidieron un proyecto de muestra para reproducir el problema y no es algo que pueda reproducir para ellos a voluntad ... sucede con algunos Exchange Error de estas alertas. –
Ok, podría organizar y enviar una aplicación de muestra ya que tengo el error cada vez que ejecuto. ¡Gracias! –