【问题标题】:How to search iOS Address book efficiently如何高效搜索 iOS 通讯录
【发布时间】:2012-03-05 02:46:11
【问题描述】:

我的应用程序能够在应用程序的不同实例之间共享其内容,即有一个按钮可以让我将文档附加到电子邮件并将其发送给应用程序的其他用户。当他们收到此文件时,它会在他们的应用程序实例中打开。这一切正常。

但是,在导入这个数据文件的过程中,我需要应用程序将通讯录记录添加到通讯录中,除非电子邮件地址已经在通讯录中,那么它必须只返回 ABRecordRef。

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

A - 遍历整个地址簿,创建一组用户定义的对象,其中包含名称和电子邮件地址(这是我所需要的)和 ABRecordRef。然后当应用读取附件文件 XML 时,它必须每次都检查这个 NSArray。

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

还有其他想法吗?

【问题讨论】:

  • 所以你的意思是例如使用 NSDictionary 并将电子邮件地址作为键?
  • 为什么不自己测试一下呢?这类问题往往缺乏理论答案,因为它们无法考虑所有未知数。
  • 我听到了,不过如果有人有这方面的经验,它会节省时间。也很难测试,因为谁知道有些人的通讯录有多大。

标签: iphone objective-c ios abaddressbook


【解决方案1】:

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

对于具有固定大小的地址数量的任意大小的地址簿要查找,搜索地址簿会更快。这是因为将所有地址放入散列的初始成本保证至少花费与书中地址数量相关的线性 (O(n)) 时间,同时(假设地址簿至少是中等效率的)查找应该是对数 (O(ln(n)) 或恒定时间 (O(x)),具体取决于实现,因为您有固定数量的地址要检查。

编辑: 对通讯录api的简单调查表明,不能简单地“搜索通讯录”,你必须复制一份,然后过滤。

使用记录标识符

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

保持对特定记录的长期引用的推荐方法是存储名字和姓氏,或名字和姓氏的哈希值,以及标识符。当您按 ID 查找记录时,将记录的名称与您存储的名称进行比较。如果不匹配,则使用存储的名称查找记录,并为记录存储新的 ID。

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

【讨论】:

  • ABAddressBookCopyPeopleWithName 看起来无需先复制即可搜索。
  • 没错,只是他不是按姓名搜索,而是按电子邮件地址搜索,而且没有办法通过电子邮件地址检索人。
【解决方案2】:

鉴于 iOS 中通讯录的限制,将通讯录复制到 NSDictionary 会比每次都尝试搜索要快。

假设您可以在电子邮件地址冲突上进行覆盖,我将创建一个字典,其中电子邮件地址作为键,并将 ABRecordRef 存储为对象的 NSNumber。

我会在后台队列中执行所有这些操作,然后监视地址簿更改并根据需要重新加载字典。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多