最近在做读取系统通讯录并排序,发现了一个第三方库不错。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-value
else
{
//创建新发可变数组存储该首字母对应的联系人模型
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~Z
NSArray *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