PPGetAddressBook获取系统通讯录并排序
最近在做读取系统通讯录并排序,发现了一个第三方库不错。PPGetAddressBook读取4000个联系人时间大概2秒左右。优点:
1 拼音转换时间对比了PinYin4Objc更快些。
2 处理了几个姓里面有多音的情况。
3 按照拼音首字母排序速度比较快。
//这个方法比pin4 obj更快一些
+ (NSString *)getFirstLetterFromString:(NSString *)aString
{/*** **************************************** START **************************************** 之前PPGetAddressBook对联系人排序时在中文转拼音这一部分非常耗时* 参考博主-庞海礁先生的一文:iOS开发中如何更快的实现汉字转拼音 http://www.olinone.com/?p=131* 使PPGetAddressBook对联系人排序的性能提升 3~6倍, 非常感谢!*/NSMutableString *mutableString = [NSMutableString stringWithString:aString];CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false);NSString *pinyinString = [mutableString stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:[NSLocale currentLocale]];/*** *************************************** END *******************************************/// 将拼音首字母装换成大写NSString *strPinYin = [[self polyphoneStringHandle:aString pinyinString:pinyinString] uppercaseString];// 截取大写首字母NSString *firstString = [strPinYin substringToIndex:1];// 判断姓名首位是否为大写字母NSString * regexA = @"^[A-Z]$";NSPredicate *predA = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexA];// 获取并返回首字母return [predA evaluateWithObject:firstString] ? firstString : @"#";}/**多音字处理*/
+ (NSString *)polyphoneStringHandle:(NSString *)aString pinyinString:(NSString *)pinyinString
{if ([aString hasPrefix:@"长"]) { return @"chang";}if ([aString hasPrefix:@"沈"]) { return @"shen"; }if ([aString hasPrefix:@"厦"]) { return @"xia"; }if ([aString hasPrefix:@"地"]) { return @"di"; }if ([aString hasPrefix:@"重"]) { return @"chong";}return pinyinString;
}
#pragma mark - 获取按A~Z顺序排列的所有联系人
+ (void)getOrderAddressBook:(AddressBookDictBlock)addressBookInfo authorizationFailure:(AuthorizationFailure)failure
{NSTimeInterval startTime=[[NSDate date] timeIntervalSince1970];// 将耗时操作放到子线程dispatch_queue_t queue = dispatch_queue_create("addressBook.infoDict", DISPATCH_QUEUE_SERIAL);dispatch_async(queue, ^{NSMutableDictionary *addressBookDict = [NSMutableDictionary dictionary];[kPPAddressBookHandle getAddressBookDataSource:^(PPPersonModel *model) {//获取到姓名的大写首字母//NSString *firstLetterString = [self getFirstLetterFromString:model.name];NSString *firstLetterString = [self getFirstLetterFromString:model.name];//如果该字母对应的联系人模型不为空,则将此联系人模型添加到此数组中if (addressBookDict[firstLetterString]){[addressBookDict[firstLetterString] addObject:model];}//没有出现过该首字母,则在字典中新增一组key-valueelse{//创建新发可变数组存储该首字母对应的联系人模型NSMutableArray *arrGroupNames = [NSMutableArray arrayWithObject:model];[arrGroupNames addObject:model];//将首字母-姓名数组作为key-value加入到字典中[addressBookDict setObject:arrGroupNames forKey:firstLetterString];}} authorizationFailure:^{dispatch_async(dispatch_get_main_queue(), ^{failure ? failure() : nil;});}];NSTimeInterval endTime=[[NSDate date] timeIntervalSince1970];NSTimeInterval totalTime=endTime-startTime;NSLog(@"时间:---%f",totalTime);// 将addressBookDict字典中的所有Key值进行排序: A~ZNSArray *nameKeys = [[addressBookDict allKeys] sortedArrayUsingSelector:@selector(compare:)];// 将 "#" 排列在 A~Z 的后面if ([nameKeys.firstObject isEqualToString:@"#"]){NSMutableArray *mutableNamekeys = [NSMutableArray arrayWithArray:nameKeys];[mutableNamekeys insertObject:nameKeys.firstObject atIndex:nameKeys.count];[mutableNamekeys removeObjectAtIndex:0];dispatch_async(dispatch_get_main_queue(), ^{addressBookInfo ? addressBookInfo(addressBookDict,mutableNamekeys) : nil;});return;}// 将排序好的通讯录数据回调到主线程dispatch_async(dispatch_get_main_queue(), ^{addressBookInfo ? addressBookInfo(addressBookDict,nameKeys) : nil;});});}
demo地址: http://download.csdn.net/download/jueyi1127/10237329
PPGetAddressBook获取系统通讯录并排序相关推荐
- IOS获取系统通讯录联系人信息
2019独角兽企业重金招聘Python工程师标准>>> IOS获取系统通讯录联系人信息 一.权限注册 随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统 ...
- IOS 获取系统通讯录中的联系人信息
- (IBAction)getAllContactFromSystem { ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NUL ...
- iOS10 获取系统通讯录新方法
所需框架 #import <ContactsUI/ContactsUI.h> 遵循代理 CNContactPickerDelegate 调用通讯录 如果在iOS10的机器上调用以前的ABP ...
- iOS调用系统通讯录获取姓名电话号码
iOS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可以使用) 1.导入头文件. #import <AddressBook/AddressBook.h> #import ...
- iOS开发------获取系统联系人(AddressBook篇)
AddressBook是Apple提供给我们获取系统联系人的一个很方便类库,与其说方便,其实刚开始还是比较崩溃的,从开发文档来看,它还是偏向于C语言,并且不在ARC的控制之下,虽然在iOS9.0之后会 ...
- 获取手机通讯录 (含SIM卡中的联系人)
sim卡UIR content://icc/fdn content://sim/fdn MOTO XT800比较异常,通讯录在: content://contacts/phones 1.使用andro ...
- python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间、内存使用量、内存占用率、PID、名称、创建时间等;
python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间.内存使用量.内存占用率.PID.名称.创建时间等: psutil模块可以跨平台使用,支持Linux/ ...
- 怎么调用系统通讯录并向被选中联系人发送短信
每做一个项目都会有收获,前提是要在这个项目上付出努力的! 好吧,如今讲一下:怎么通过调用系统通讯录,当你点击联系人姓名时,跳转到向其发送短信的页面<收件人是被点中的联系人,短信已自己主动编辑&g ...
- android 获取单个通讯录联系人信息(无权限跳转权限设置页面)
首先说一下,在魅族手机上需要用户手动开启权限,不然获取到的cursor.moveToFirst()会返回false,反过来,如果cursor.moveToFirst()返回false,一般都是权限问题 ...
最新文章
- 我来悟微服务(3)-需求管理
- jenkins-git-gradle配置项目
- 一分钟开启Tomcat https支持
- Angular 2与TypeScript概览
- 解决 No projects are available for deployment to this server!
- 无法运行的愿意_分享减肥食谱一周瘦10斤,你愿意尝试吗?
- 《设计的品格 探索×呈现×进化的InDesign美学》目录—导读
- React Native重构路线图发布!
- python flask将读取的图片返回给web前端
- CDH大数据平台搭建
- 不是愚人节玩笑 Conficker猎获英议会IT系统
- 计算机网络实验二局域网络搭建,计算机网络实验二简单共享局域网组建.doc
- 新手学习MAYA的几个建议
- Umeng App监管执法合规自查通知
- 平板电脑支持html吗,HTML5视频无法在平板电脑上播放(HTML5 video not playing on tablets)...
- 【git】No supported authentication methods available(server sent:pubickey)
- 华为薪资垫底,腾讯阿里被逆袭,第一竟然是…
- Node-RED使用指南:26:使用exec执行系统命令
- office安装出现了“office对安装源的访问被拒绝30068-4(5)”错误
- no SQ lines present in the header解决方案