我的应用程序能够在应用程序的不同实例之间共享其内容,即有一个按钮可以让我将文档附加到电子邮件并将其发送给应用程序的其他用户。当他们收到此文件时,会在他们的应用实例中打开。这一切都有效。
但是,在导入此数据文件期间,我需要应用程序将地址簿记录添加到地址簿中,除非电子邮件地址已经在地址簿中,然后它必须只返回ABRecordRef。
我需要决定哪种方法更有效:
A - 循环遍历整个地址簿,创建一个用户定义对象的数组,其中包含姓名和电子邮件地址(这是我所需要的)和ABRecordRef。然后,当应用程序正在读取附件文件XML时,它必须每次都检查此NSArray。
B - 每次在附件XML中遇到联系人时都会访问地址簿,并根据电子邮件地址搜索地址簿,例如ABAddressBookCopyArrayOfAllPeople
还有其他想法吗?
答案 0 :(得分:3)
注意:这适用于通过电子邮件地址搜索。如果您按名称搜索,则不适用。
对于具有固定大小的地址数量的任意大小的地址簿来查找,搜索地址簿会更快。这是因为将所有地址放入哈希的初始成本相对于书中的地址数量保证至少是线性(O(n)
)时间(假设地址簿至少是中等效率) )查找应该是对数(O(ln(n)
)或常数时间(O(x)
),具体取决于实现,因为您有固定数量的地址要检查。
编辑: 对地址簿api的简要调查显示,您不能简单地“搜索地址簿”,您必须复制然后过滤它。
使用记录标识符
通讯簿数据库中的每条记录都有唯一的记录标识符。除非删除该记录或重置MobileMe同步数据,否则此标识符始终引用相同的记录。记录标识符可以在线程之间安全地传递。不保证它们在不同设备上保持不变。
保持对特定记录的长期引用的推荐方法是除了标识符之外还存储名字和姓氏,或者名字和姓氏的哈希值。按ID查找记录时,请将记录的名称与存储的名称进行比较。如果它们不匹配,请使用存储的名称查找记录,并存储记录的新ID。
要获取记录的记录标识符,请使用ABRecordGetRecordID函数。要按标识符查找人员记录,请使用ABAddressBookGetPersonWithRecordID函数。要按标识符查找组,请使用函数ABAddressBookGetGroupWithRecordID。要按名称查找人员记录,请使用ABAddressBookCopyPeopleWithName函数。
答案 1 :(得分:1)
考虑到iOS中地址簿的限制,将地址簿复制到NSDictionary中比每次尝试搜索更快。
假设您可以覆盖电子邮件地址冲突,我会创建一个字典,其中电子邮件地址为密钥,ABRecordRef存储为对象的NSNumber。
我会在后台队列上执行所有操作,然后监视地址簿更改并根据需要重新加载字典。
我们在地址簿中遇到了数千个条目的用户。在这些情况下,您可能希望创建记录对象并将其存储在Core Data中。通过过滤上次修改日期,您可以确定是否更新给定记录的电子邮件地址。