最近在做读取系统通讯录并排序,发现了一个第三方库不错。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获取系统通讯录并排序相关推荐

  1. IOS获取系统通讯录联系人信息

    2019独角兽企业重金招聘Python工程师标准>>> IOS获取系统通讯录联系人信息 一.权限注册 随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统 ...

  2. IOS 获取系统通讯录中的联系人信息

    - (IBAction)getAllContactFromSystem { ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NUL ...

  3. iOS10 获取系统通讯录新方法

    所需框架 #import <ContactsUI/ContactsUI.h> 遵循代理 CNContactPickerDelegate 调用通讯录 如果在iOS10的机器上调用以前的ABP ...

  4. iOS调用系统通讯录获取姓名电话号码

    iOS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可以使用) 1.导入头文件. #import <AddressBook/AddressBook.h> #import ...

  5. iOS开发------获取系统联系人(AddressBook篇)

    AddressBook是Apple提供给我们获取系统联系人的一个很方便类库,与其说方便,其实刚开始还是比较崩溃的,从开发文档来看,它还是偏向于C语言,并且不在ARC的控制之下,虽然在iOS9.0之后会 ...

  6. 获取手机通讯录 (含SIM卡中的联系人)

    sim卡UIR content://icc/fdn content://sim/fdn MOTO XT800比较异常,通讯录在: content://contacts/phones 1.使用andro ...

  7. python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间、内存使用量、内存占用率、PID、名称、创建时间等;

    python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间.内存使用量.内存占用率.PID.名称.创建时间等: psutil模块可以跨平台使用,支持Linux/ ...

  8. 怎么调用系统通讯录并向被选中联系人发送短信

    每做一个项目都会有收获,前提是要在这个项目上付出努力的! 好吧,如今讲一下:怎么通过调用系统通讯录,当你点击联系人姓名时,跳转到向其发送短信的页面<收件人是被点中的联系人,短信已自己主动编辑&g ...

  9. android 获取单个通讯录联系人信息(无权限跳转权限设置页面)

    首先说一下,在魅族手机上需要用户手动开启权限,不然获取到的cursor.moveToFirst()会返回false,反过来,如果cursor.moveToFirst()返回false,一般都是权限问题 ...

最新文章

  1. 我来悟微服务(3)-需求管理
  2. jenkins-git-gradle配置项目
  3. 一分钟开启Tomcat https支持
  4. Angular 2与TypeScript概览
  5. 解决 No projects are available for deployment to this server!
  6. 无法运行的愿意_分享减肥食谱一周瘦10斤,你愿意尝试吗?
  7. 《设计的品格 探索×呈现×进化的InDesign美学》目录—导读
  8. React Native重构路线图发布!
  9. python flask将读取的图片返回给web前端
  10. CDH大数据平台搭建
  11. 不是愚人节玩笑 Conficker猎获英议会IT系统
  12. 计算机网络实验二局域网络搭建,计算机网络实验二简单共享局域网组建.doc
  13. 新手学习MAYA的几个建议
  14. Umeng App监管执法合规自查通知
  15. 平板电脑支持html吗,HTML5视频无法在平板电脑上播放(HTML5 video not playing on tablets)...
  16. 【git】No supported authentication methods available(server sent:pubickey)
  17. 华为薪资垫底,腾讯阿里被逆袭,第一竟然是…
  18. Node-RED使用指南:26:使用exec执行系统命令
  19. office安装出现了“office对安装源的访问被拒绝30068-4(5)”错误
  20. no SQ lines present in the header解决方案

热门文章

  1. go语言上手-HTTP 文件服务器
  2. 职场中如何发挥自己的长处和优势
  3. 《R语言数据分析》期末试题
  4. C语言队列函数中pop,C语言_队列的基本操作
  5. 企业级SSD产品对比
  6. Python--Matplotlib(基本用法)
  7. v-if和v-for的优先级
  8. Chocolatey 包管理器安装配置
  9. Nginx-应用:静态资源部署、反向代理以及负载均衡
  10. 【ESP32 乐鑫 离线环境搭建】