Libreta de direcciones de iOS en queue diferente

A continuación, se muestra algo de mi código que no bloquea el hilo principal al cargar contactos en una vista de tabla. Parece que funciona bien, pero me pregunto si esto eventualmente causará algún comportamiento erradicado después de que se llame a dispatch_async siguiente if (accessGranted). Si lo que estoy haciendo es una buena práctica, entonces tal vez esto ayude a algunas personas porque he visto muchas personas con preguntas sobre AB con muchas respuestas diferentes (probablemente debido a la pobre documentation de AB), pero si no es así, es de esperar que alguien pueda decir yo lo que estoy haciendo mal

Mi entendimiento es que esto sería seguro para subprocesss porque todo se está haciendo en el mismo subprocess.

CFErrorRef error = nil; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); __block BOOL accessGranted = NO; if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 or later dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { accessGranted = granted; dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); } else { // we're on iOS 5 or older accessGranted = YES; } if (accessGranted) { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook); CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault, CFArrayGetCount(contacts), contacts); CFArraySortValues(peopleMutable, CFRangeMake(0, CFArrayGetCount(peopleMutable)), (CFComparatorFunction) ABPersonComparePeopleByName, kABPersonSortByFirstName); CFRelease(contacts); for (CFIndex i = 0; i < CFArrayGetCount(peopleMutable); i++) { ABRecordRef record = CFArrayGetValueAtIndex(peopleMutable, i); ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(record, kABPersonPhoneProperty); if (CFBridgingRelease(ABMultiValueCopyValueAtIndex(phoneNumberProperty, 0)) != nil) { NSString *firstName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty)); NSString *lastName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonLastNameProperty)); NSString *phoneNumbers = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phoneNumberProperty, 0); } CFRelease(phoneNumberProperty); } CFRelease(peopleMutable); dispatch_async(dispatch_get_main_queue(), ^{ // Update UI [self.tableView reloadData]; }); }); }