您的位置:首页 > 产品设计 > UI/UE

ABAddressBookRequestAccessWithCompletion线程安全

2014-10-17 14:27 465 查看

1、访问通讯录

iOS在第一次访问用户通讯录时,需要调用ABAddressBookRequestAccessWithCompletion然后在CallBack中调用UI模块进行联系人数据展示。
一般的形式如下:
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
if (granted)
{
//展示联系人数据
}
else
{
//提示用户设置访问权限
}
});

2、线程安全

用于回调的block是在子线程被调用,可以在block中添加如下代码:

ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted,CFErrorRef error) {
if ([[NSThreadcurrentThread]isMainThread]) {
NSLog(@"main thread");
}
else
{
NSLog(@"child thread");
});

运行会发现,最后是子线程回调该block的,如果在子线程中直接操作UI模块是不被允许的,UI的操作应该放在主线程中:

ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
// if ([[NSThread currentThread] isMainThread]) {
// //NSLog(@"main thread");
// }
// else
// {
// //NSLog(@"child thread");
// }
dispatch_async(dispatch_get_main_queue(), ^{
if (granted)
{
TKContactsMultiPickerController *contactMultiController = [[TKContactsMultiPickerController alloc] initWithGroup:nil];
contactMultiController.addressBook = self.addressBook;
contactMultiController.delegate = self;
[self.navigationController pushViewController:contactMultiController animated:YES];

}
else
{
[self.view makeToast:NSLocalizedString(@"your system Settin", nil)
duration:1.0
position:@"center"];
}
});
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: