gpt4 book ai didi

ios - AddressBook 联系人搜索在大列表上很慢,如何改进?

转载 作者:行者123 更新时间:2023-11-29 02:16:25 24 4
gpt4 key购买 nike

我编写了以下方法来准备联系人词典列表:名字、姓氏和电子邮件(如果不存在则忽略)

 ...
// 'filter' is search String

NSArray *lContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addrBook);

for (id lPerson in lContacts) {

BOOL bFound = NO;

CFStringRef lFirstName = ABRecordCopyValue((__bridge ABRecordRef)lPerson, kABPersonFirstNameProperty);
CFStringRef lLocalizedFirstName = (lFirstName != nil)? ABAddressBookCopyLocalizedLabel(lFirstName): nil;
CFStringRef lLastName = ABRecordCopyValue((__bridge ABRecordRef)lPerson, kABPersonLastNameProperty);
CFStringRef lLocalizedLastName = (lLastName != nil)? ABAddressBookCopyLocalizedLabel(lLastName): nil;

ABMultiValueRef emailMultiValue = ABRecordCopyValue((__bridge ABRecordRef)lPerson, kABPersonEmailProperty);
NSArray *emailAddresses = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue);


if (emailAddresses == nil){

if(lLocalizedLastName != nil)
CFRelease(lLocalizedLastName);
if(lLastName != nil)
CFRelease(lLastName);
if(lLocalizedFirstName != nil)
CFRelease(lLocalizedFirstName);
if(lFirstName != nil)
CFRelease(lFirstName);
continue;
}

NSString *firstName = nil;
NSString *lastName = nil;
NSString *email = nil;

NSMutableDictionary *aContact =[[NSMutableDictionary alloc] init];

if(lLocalizedFirstName != nil) {
firstName=[NSString stringWithFormat:@"%@",(__bridge NSString *)lLocalizedFirstName];

if([firstName hasPrefix:filter]){
bFound = YES;
}
[aContact setValue:firstName forKey:@"firstName"];
}
if(lLocalizedLastName != nil) {
lastName=[NSString stringWithFormat:@"%@",(__bridge NSString *)lLocalizedLastName];
if(bFound == NO && [lastName hasPrefix:filter]){
bFound = YES;
}
[aContact setValue:lastName forKey:@"lastName"];
}

for (NSString* email in emailAddresses) {
if (email != nil && [email length] > 0) {

if(bFound == NO && [email containsString:filter]){
bFound = YES;
}

[aContact setValue:email forKey:@"email"];

if( bFound == YES){
[returnContactsNew addObject:aContact];
}

}
}

if(lLocalizedLastName != nil)
CFRelease(lLocalizedLastName);
if(lLastName != nil)
CFRelease(lLastName);
if(lLocalizedFirstName != nil)
CFRelease(lLocalizedFirstName);
if(lFirstName != nil)
CFRelease(lFirstName);

if(emailAddresses != nil){
CFRelease(emailMultiValue);
}
}

当用户点击至少两个字母并且如果用户有大约 300 个联系人时,我会触发此代码 - 需要 50-60 毫秒

我在具有 25K 联系人 的用户设备上测试了相同的代码,来自 Facebook、WhatsApp ......但在这种情况下需要 17 秒!!! 到得到结果。

假设我仅在打字速度快于 300 毫秒时才开始搜索,因此第一次搜索需要 17 秒。

我的代码有什么问题吗?

我想使用 NSPredicate 并首先加载所有联系人,然后过滤它们:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(firstName BEGINSWITH[c] $letter) OR (lastName BEGINSWITH[c] $letter) OR (email BEGINSWITH[c] $letter)"];

NSArray *filteredContacts = [returnContactsNew filteredArrayUsingPredicate:[ predicate predicateWithSubstitutionVariables:@{@"letter": filter}] ];

但是从日志中我同时得到了+/-

iOS 有没有其他快速的通讯录搜索算法?因为在所有 25K 联系人上循环运行似乎有点困惑

最佳答案

问题是你正在与框架进行一些斗争。

API 的设计并未公开优化供您搜索。提供的 API 旨在供用户使用提供的搜索

ABPeoplePickerNavigationController

https://developer.apple.com/library/ios/documentation/AddressBookUI/Reference/ABPeoplePickerNavigationController_Class/index.html#//apple_ref/occ/cl/ABPeoplePickerNavigationController

该 View Controller 进行搜索。

对于这么多记录,基本方法的工作速度不够快,您应该考虑构建一些分段索引。这意味着您的第一次使用会很慢,后来会更好,但当真正的来源发生变化时需要维护您的索引。

考虑到这实际上与框架设计有何不同,您可能会重新评估设计的值(value),以了解保持设计所需的工作量和用户体验。

关于ios - AddressBook 联系人搜索在大列表上很慢,如何改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28694899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com