我想在iPhone地址簿中搜索一个特定的电话号码,然后检索联系人名。目前,我正在循环遍历所有联系人,提取多值属性并与值进行比较。这需要花费太多的时间。我读过苹果地址簿指南,他们说:
“完成其他类型的搜索,使用ABAddressBookCopyArrayOfAllPeople函数,然后使用NSArray方法filteredArrayUsingPredicate:”筛选结果。
有人能给我举个例子来说明如何做到这一点吗?
谢谢。
发布于 2011-06-08 11:04:58
如果你想在有电话号码的联系人中搜索一下,我会告诉你一个建议。
1.取得所有联系人
NSArray *thePeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);2.从联系人数组(ThePeoples)创建另一个数组(记录),
记录: record1,record2,....recordN
记录:{myContactName: phoneNumber:"1234567890"}
3.使用谓词搜索mutableArray(记录)。
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:@"record.phoneNumber contains %@",string];
NSArray * filteredArray = [records filteredArrayUsingPredicate:myPredicate];这只是解决方案的一个简单示例,请记住phoneNumber是一个multiValue字段。因此,我们将在模型类变量中包含一个作为电话号码的数组。
发布于 2014-01-16 17:47:27
下面的方法将返回一个数组,该数组包含具有给定电话号码的所有联系人。这个方法花了0.02秒在运行iPhone 5的iOS7上搜索250个联系人。
#import <AddressBook/AddressBook.h>
-(NSArray *)contactsContainingPhoneNumber:(NSString *)phoneNumber {
/*
Returns an array of contacts that contain the phone number
*/
// Remove non numeric characters from the phone number
phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];
// Create a new address book object with data from the Address Book database
CFErrorRef error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (!addressBook) {
return [NSArray array];
} else if (error) {
CFRelease(addressBook);
return [NSArray array];
}
// Requests access to address book data from the user
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {});
// Build a predicate that searches for contacts that contain the phone number
NSPredicate *predicate = [NSPredicate predicateWithBlock: ^(id record, NSDictionary *bindings) {
ABMultiValueRef phoneNumbers = ABRecordCopyValue( (__bridge ABRecordRef)record, kABPersonPhoneProperty);
BOOL result = NO;
for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
NSString *contactPhoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);
contactPhoneNumber = [[contactPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];
if ([contactPhoneNumber rangeOfString:phoneNumber].location != NSNotFound) {
result = YES;
break;
}
}
CFRelease(phoneNumbers);
return result;
}];
// Search the users contacts for contacts that contain the phone number
NSArray *allPeople = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
NSArray *filteredContacts = [allPeople filteredArrayUsingPredicate:predicate];
CFRelease(addressBook);
return filteredContacts;
}发布于 2011-08-08 09:30:20
用这个。这是我的密码。制作搜索阵列。
NSLog(@"=====Make People Array with Numbers. Start.");
peopleWithNumber = [[NSMutableDictionary alloc] init];
for (int i=0; i < [people count]; i++) {
NSInteger phoneCount = [self phoneCountAtIndex:i];
if (phoneCount != 0) {
NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init];
for (int j=0 ; j < phoneCount ; j++) {
[phoneNumbers addObject:[self phoneNumberAtIndex:i phoneIndex:j]];
}
[peopleWithNumber addEntriesFromDictionary:
[NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithArray:phoneNumbers], [self fullNameAtIndex:i], nil]];
}
}
NSLog(@"=====Make People Array with Numbers. End.\n");搜索方法它(PeopleWithNumber)将比使用数组(人员)更快
“ABAddressBookCopyArrayOfAllPeople(addressBook);”NSArray *people = (NSArray *)
- (NSArray *)searchNamesByNumber:(NSString *)number {
NSString *predicateString = [NSString stringWithFormat:@"%@[SELF] contains '%@'",@"%@",number];
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:predicateString,peopleWithNumber,number];
NSArray *names = [[peopleWithNumber allKeys] filteredArrayUsingPredicate:searchPredicate];
return names;
}https://stackoverflow.com/questions/5153377
复制相似问题