2

像标题一样,通过电话号码在设备通讯录中查找联系人的最佳和有效方法是什么?实际上我使用这样的方法:

注意:
[rm getElencoContatti]返回通讯录中的所有联系人 从通讯录
[contatto getID]返回联系人 id 从通讯录
[contatto getNumeriContatto]返回所有联系人的电话号码

+(NSMutableDictionary *)getNomeContattoDaNumero:(NSString *)numeroTelefono {

    NSMutableDictionary *returnValue = [[NSMutableDictionary alloc]init];
    NSNumber *idContact;

    for(ContattoRubrica *contatto in [rm getElencoContatti]) {
        idContact = [contatto getID];
        for(id numero in [contatto getNumeriContatto]) {

            if([numeroTelefono isEqualToString:[numero objectForKey:@"numeroTelefono"]]) {

                [returnValue setValue:[contatto getNomeContatto] forKey:@"nome"];
                [returnValue setValue:idContact forKey:@"idContatto"];

                return returnValue;
            }
        }
    }

    [returnValue setValue:numeroTelefono forKey:@"nome"];
    [returnValue setValue:[NSNumber numberWithInt:-1] forKey:@"idContatto"];

    return returnValue;

}

我用大约200个联系人的通讯录测试了这个方法,这个功能很慢。是否存在任何自动执行此操作的 ABAddressbook.h 方法?

提前致谢。

4

1 回答 1

2

ABAddressBookiOS 上提供的搜索功能比 Mac OS 上的等效 API 少。不幸的是,过滤联系人将需要线性扫描,例如您在上面显示的那个。Apple 的文档包含使用基于块的谓词的稍微不同的方法,但它基本上等同于您在此处所做的。

一种可能的加速方法是避免ContattoRubrica在执行搜索并找到(或未找到)匹配ABPerson记录之前构建所有对象。在任何情况下,您都应该使用 Instruments 来确定您的代码大部分时间都花在了哪里。

于 2013-01-07T17:39:06.303 回答