在iOS中,加载排序的联系人列表的最快方法是什么?

时间:2012-11-08 00:17:39

标签: ios sorting contacts addressbook abaddressbook

当实现类似于ABPeoplePickerNavigationController的视图时,我无法非常快速地对列表进行排序。原生联系人应用程序立即加载列表。我正在处理4000多个联系人,因此保持加载时间非常重要。我无法使用ABPeoplePickerNavigationController,因为我需要做很多自定义UI工作。

我使用ABAddressBookCopyArrayOfAllPeople,然后使用sectionForObject将人员放在UILocalizedIndexedCollation个部分中,然后使用sortedArrayFromArray对部分进行排序。对于4000个联系人,我的时间大约是8秒。

然后我切换到使用ABAddressBookCopyArrayOfAllSources和每个源ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering,只是将每个源的联系人附加到未排序的数组,然后使用相同的UILocalizedIndexedCollation技术。这个时间下降到大约5秒钟,我想因为这些部分大部分已经分类了。

有没有办法改善这个?我不知道的任何技术?我可以以某种方式加载ABPeoplePickerNavigationController数据源而不使用该视图并使用它吗?或者是否有更快的排序方法?

非常感谢。

2 个答案:

答案 0 :(得分:0)

  

有没有办法改善这个?

可能有助于意识到您永远不需要立即显示4000个名字。您真正需要的只是用户正在查看的任何部分的名称,您可以更快地找到并对这些名称进行排序。假设用户最初正在查看A部分,所以也许您可以使用谓词来选择以A开头的名称。在4000个名称中,可能400个以A开头,并且这会将您的排序时间减少到一小部分第二。您可以在后台继续提取和排序部分。

重点是,对所有记录进行排序所需的时间并不重要。重要的是将用户想要的记录放在屏幕上需要多长时间。

答案 1 :(得分:0)

这些联系人存储在哪里?他们是在CoreData吗?

我会将CoreData与NSFetchedResultsController一起使用,它可以处理所有内容,因此您无需关心加载时间,因为NSFetchedResultsController加载了与tableView当前可见单元格所需的联系人数量。

我希望这有助于你

Linard