2012-02-13 49 views
2

我的应用程序能够在应用程序的不同实例之间共享其内容,即有一个按钮可让我将文档附加到电子邮件并将其发送给应用程序的另一个用户。当他们收到这个文件时,它会在他们的应用程序实例中打开。这一切都工作。如何有效地搜索iOS地址簿

但是,在导入这个数据文件的过程中,我需要应用程序将地址簿记录添加到地址簿中,除非电子邮件地址已经存在于地址簿中,否则它只能返回ABRecordRef。

我需要决定哪种方法更有效:

A - 遍历整个地址簿中创建用户定义的对象与姓名和电子邮件地址(这是所有我需要)和ABRecordRef的数组。然后,当应用程序正在读取附件文件XML时,它必须每次检查此NSArray。

B - 每次遇到附件XML中的联系人并根据电子邮件地址搜索它时访问地址簿。 ABAddressBookCopyArrayOfAllPeople

还有其他想法吗?

+0

所以你的意思为如使用NSDictionary并将电子邮件地址作为密钥? – TheLearner 2012-02-13 17:35:33

+0

为什么不自己测试一下呢?对这类问题的理论答案往往是缺乏的,因为他们无法考虑所有未知因素。 – mydogisbox 2012-02-13 17:38:33

+0

我听到你的声音,但是如果有人有这方面的经验,它会节省时间。也很难测试谁知道一些人的地址簿有多大。 – TheLearner 2012-02-13 17:40:25

回答

3

注意:这适用于通过电子邮件地址进行搜索。如果您按名称搜索,则不适用。

对于要查找的地址数量固定的任意大小的地址簿,搜索地址簿会更快。这是因为将所有地址放入哈希中的初始成本保证至少相对于本书中的地址数量呈线性(O(n))时间,同时(假设地址簿至少适度高效)查找应该是取决于实施方案,因为您有固定数量的地址要检查,所以要么是对数(O(ln(n))要么是恒定时间(O(x))。

编辑: 对地址簿API的简要调查显示,您不能简单地“搜索地址簿”,您必须复制并过滤它。

使用记录标识

在通讯簿数据库的每条记录都有一个唯一的记录标识符。此标识符始终指向同一条记录,除非该记录被删除或MobileMe同步数据被重置。记录标识符可以在线程之间安全传递。他们不保证在不同设备上保持不变。

对特定记录保持长期引用的推荐方法是除标识符之外还存储名字和姓氏,或名字和姓氏的散列。当您通过ID查找记录时,将记录名称与您的存储名称进行比较。如果它们不匹配,请使用存储的名称查找记录,并存储记录的新ID。

要获取记录的记录标识符,请使用函数ABRecordGetRecordID。要按标识查找人员记录,请使用ABAddressBookGetPersonWithRecordID函数。要通过标识符查找组,请使用函数ABAddressBookGetGroupWithRecordID。要按名称查找人员记录,请使用ABAddressBookCopyPeopleWithName函数。

+0

[ABAddressBookCopyPeopleWithName(https://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/c/func/ABAddressBookCopyPeopleWithName)看起来像它可以在没有搜索首先制作副本。 – Karoh 2013-07-30 16:56:07

+1

的确如此,除了他不按姓名搜索,他正在通过电子邮件地址进行搜索,并且没有办法通过电子邮件地址检索人员。 – mydogisbox 2013-07-30 17:10:39

1

鉴于iOS中地址簿的局限性,将地址簿复制到NSDictionary中将比尝试每次搜索更快。

假设你是罚款的方式覆盖在电子邮件地址冲突,我想创建一个字典的电子邮件地址作为存储为的NSNumber的对象键和ABRecordRef。

我会做这一切的背景队列,然后监视地址簿更改并重新加载字典根据需要。

我们遇到了用户在他们的地址簿几千项。在这些情况下,您可能需要创建一个记录对象并将其存储在Core Data中。通过过滤最后修改日期,您可以确定是否更新给定记录的电子邮件地址。