2014-11-04 83 views

回答

0

你可以这样做:

NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); 
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id person, NSDictionary *bindings) { 
    NSString *firstName = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonFirstNameProperty)); 
    if (firstName && [firstName rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location == 0) 
     return TRUE; 

    NSString *lastName = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonLastNameProperty)); 
    if (lastName && [lastName rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location == 0) 
     return TRUE; 

    // repeat for all of the properties you want to search 

    return FALSE; 
}]; 
NSArray *searchResults = [allPeople filteredArrayUsingPredicate:predicate]; 

注意,如果做很多这样的搜索结果,并且要作废这样ABRecordCopyValue块内,你可以创建自己的自定义对象的数组(或字典)与你想要的任何密钥进行比较,从而对所有记录的所有字段执行一次ABRecordCopyValue,然后可以重复使用predicateWithFormat作为自定义对象数组,而不会产生重复执行ABRecordCopyValue的开销。但我不相信苹果曾经发布过密钥,可以与ABRecordRef阵列一起使用,您可以自己与predicateWithFormat一起使用。


如果你只是想搜索的名称,你也可以使用ABAddressBookCopyPeopleWithName,从而消除了谓词共需要:

NSArray *searchResults = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, (__bridge CFStringRef)searchTerm)); 
+0

谢谢你也会试试这个.........并且会在这里更新,如果有什么对我有用的话 – Sambhav 2014-11-04 13:05:03

0

为什么wana使用NSPredicate? ...看看这个链接,如果它是helpful

+0

此链接是不开放..想用nspredicate为更快的搜索。我有5000多个联系人 – Sambhav 2014-11-04 11:53:17

+0

通过URL判断,我认为这是[预期的链接](https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AddressBook/Tasks/Searching.html#//apple_ref/DOC/UID/20001024-BABHHIHC)。不幸的是,这是为Mac OS地址簿框架,而不是iOS框架(这是不同的)。 – Rob 2014-11-04 13:44:07

相关问题