当实现类似于ABPeoplePickerNavigationController
的视图时,我无法非常快速地对列表进行排序。原生联系人应用程序立即加载列表。我正在处理4000多个联系人,因此保持加载时间非常重要。我无法使用ABPeoplePickerNavigationController
,因为我需要做很多自定义UI工作。
我使用ABAddressBookCopyArrayOfAllPeople
,然后使用sectionForObject将人员放在UILocalizedIndexedCollation
个部分中,然后使用sortedArrayFromArray
对部分进行排序。对于4000个联系人,我的时间大约是8秒。
然后我切换到使用ABAddressBookCopyArrayOfAllSources
和每个源ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
,只是将每个源的联系人附加到未排序的数组,然后使用相同的UILocalizedIndexedCollation
技术。这个时间下降到大约5秒钟,我想因为这些部分大部分已经分类了。
有没有办法改善这个?我不知道的任何技术?我可以以某种方式加载ABPeoplePickerNavigationController
数据源而不使用该视图并使用它吗?或者是否有更快的排序方法?
非常感谢。
答案 0 :(得分:0)
有没有办法改善这个?
可能有助于意识到您永远不需要立即显示4000个名字。您真正需要的只是用户正在查看的任何部分的名称,您可以更快地找到并对这些名称进行排序。假设用户最初正在查看A部分,所以也许您可以使用谓词来选择以A开头的名称。在4000个名称中,可能400个以A开头,并且这会将您的排序时间减少到一小部分第二。您可以在后台继续提取和排序部分。
重点是,对所有记录进行排序所需的时间并不重要。重要的是将用户想要的记录放在屏幕上需要多长时间。
答案 1 :(得分:0)
这些联系人存储在哪里?他们是在CoreData吗?
我会将CoreData与NSFetchedResultsController一起使用,它可以处理所有内容,因此您无需关心加载时间,因为NSFetchedResultsController加载了与tableView当前可见单元格所需的联系人数量。
我希望这有助于你
Linard