使用CFStringTransform将汉字转成拼音,非常耗时!

问题

最近做一个通讯录项目,需要将联系人读入app内(通讯录有400人左右),并依照首字母排序。这里使用了在将汉字转化成拼音的时候,iOS系统自带接口:

注意self.latinString需要是一个mutable的string

        //1.将非字符串转化成拉丁字母
        CFStringTransform((__bridge CFMutableStringRef)self.latinString, NULL, kCFStringTransformMandarinLatin, NO);
        CFStringTransform((__bridge CFMutableStringRef)self.latinString, NULL, kCFStringTransformStripDiacritics, NO);

但是,app启动时候,非常的慢。因为在加载联系人,并且将汉字转化成pinyin。下面看看对比结果:

如果直接转化:

>> 2014-10-17 16:14:03.988 [contact_log]ContactList.m:87 -[ContactList loadContactFromAB] :_addressBookEngine loadAdressBook10.022583

加载一遍用了10秒。

解决办法

我的做法是:既然通讯录里的人不会经常改变,可以将所有人的名字——pinyinDic缓存起来(字典),这样读取的时候,从字典里获取拼音,应该会快很多!测试结果验证了我的猜想:

    //1.先从缓存中获得latin,然后再判断是否存在,再将非字符串转化成拉丁字母
    NSString* latin = [pinyinDic objectForKey:self.fullName];
    if (latin) {
        self.latinString = latin;
    }
    else {
        CFStringTransform((__bridge CFMutableStringRef)self.latinString, NULL, kCFStringTransformMandarinLatin, NO);
        CFStringTransform((__bridge CFMutableStringRef)self.latinString, NULL, kCFStringTransformStripDiacritics, NO);
        [pinyinDic setObject:self.latinString forKey:self.fullName];
    }
运行结果是:

>> 2014-10-17 16:18:47.992 [contact_log]ContactList.m:87 -[ContactList loadContactFromAB] :_addressBookEngine loadAdressBook0.641795

加载一次不到1秒了。

【注意】:这个时间是真机联调的时候打印的时候。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值