CFErrorRef *error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
__block BOOL accessGranted = NO;
// we're on iOS 6
if (ABAddressBookRequestAccessWithCompletion != NULL)
{
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;
}
return accessGranted;
使用dispatch_semaphore_t的原因:
代码可以在用户选择同意或者拒绝后,立即执行剩下的代码,而不是直接返回。