2014-11-04 82 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

相關問題