Mam zarejestrowaną procedurę obsługi wywołania zwrotnego, która nasłuchuje zmian w książce adresowej systemu iOS. Z powodu jakiegoś dziwnego powodu (dla którego został zgłoszony błąd), to wywołanie zwrotne może być czasem wywoływane więcej niż raz, gdy aplikacja wraca z tła. Chcę, aby mój program obsługi wywołania uruchomił swoją logikę tylko raz, nawet w przypadkach, gdy wywołanie zwrotne jest wywoływane wiele razy. W ten sposób mogę zarejestrować callback:GCD i wywołania zwrotne - problem z współbieżnością
ABAddressBookRegisterExternalChangeCallback(address_book, adressBookChanged, self);
tak właśnie skonstruowany mój obsługi wywołania zwrotnego, aby skorzystać z GCD sobie z tym poradzić. Niestety, to nie działa, a GCD nie wyklucza wewnętrzną logikę, która będzie wywoływana dwukrotnie ...
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);
}
Jestem całkiem pewien, że ten kod działa dla odbioru wielu zgłoszeń, więc są callbacks inaczej? Czy automatycznie uruchamiają różne wątki, co powoduje, że wartość fireOnce jest zawsze FALSE? W jaki sposób powinienem napisać ten kod, aby zapobiec wielokrotnemu wywołaniu wywołań zwrotnych w logice wewnętrznej więcej niż jeden raz? Sądzę, że mógłbym użyć blokad i/lub zsynchronizowanych bloków, aby to osiągnąć, ale GCD wydawał się czystszym sposobem na osiągnięcie tego.
Czy masz odniesienia do błędu, który został zgłoszony kilka razy o otrzymaniu oddzwonienia? –
9301976. Była zamknięta jakiś czas temu z powodu "niewystarczających informacji", co w zasadzie oznacza, że poprosili o przykładowy projekt do odtworzenia problemu i nie jest to coś, co mogę im powielić w dowolnym momencie ... dzieje się tak z niektórymi Exchange niewypełnienie tych alertów. –
OK, mogę ustawić i wysłać przykładową aplikację, ponieważ mam błąd przy każdym uruchomieniu. Dzięki! –