aktualizacji
na podstawie com ment z OP, spróbuj następujące API CNContactFetchRequest opartego odzyskać wszystkie kontakty bez filtra. Biegnę na ten wątek tła w celu zmniejszenia wszelkich możliwych kwestii ogromne liczby kontaktów.
func findContactsOnBackgroundThread (completionHandler:(contacts:[CNContact]?)->()) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {() -> Void in
let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),CNContactPhoneNumbersKey] //CNContactIdentifierKey
let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)
var contacts = [CNContact]()
CNContact.localizedStringForKey(CNLabelPhoneNumberiPhone)
fetchRequest.mutableObjects = false
fetchRequest.unifyResults = true
fetchRequest.sortOrder = .UserDefault
let contactStoreID = CNContactStore().defaultContainerIdentifier()
print("\(contactStoreID)")
do {
try CNContactStore().enumerateContactsWithFetchRequest(fetchRequest) { (contact, stop) -> Void in
//do something with contact
if contact.phoneNumbers.count > 0 {
contacts.append(contact)
}
}
} catch let e as NSError {
print(e.localizedDescription)
}
dispatch_async(dispatch_get_main_queue(), {() -> Void in
completionHandler(contacts: contacts)
})
})
}
Generalnie normalnie można ustawić predykat do zera, aby odzyskać wszystkie kontakty przy użyciu CNContactFetchRequest klasę zamiast, jak to opisano w kodzie.
Uwaga
Jeśli chcesz korzystać to polecam ustawienie orzeczenie true istniejące API:
NSPredicate(value: true)
ten powinien uczynić wszystkie kontakty powrócić. Jeśli to nie zadziała rozważyć przejście do CNConctactFetchRequest API wyliczyć Kontakty. W takim przypadku można następnie ustawić predykat do zera, aby pobrać wszystkie kontakty (używając CNConctactFetchRequest).
ten sposób można modyfikować istniejące metody:
func findContacts()->[CNContact] {
AppDelegate.sharedDelegate().checkAccessStatus({ (accessGranted) -> Void in
if accessGranted {
dispatch_async(dispatch_get_main_queue(), {() -> Void in
do {
let predicate: NSPredicate = NSPredicate(value: true)
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactBirthdayKey, CNContactViewController.descriptorForRequiredKeys()]
self.contacts = try self.store.unifiedContactsMatchingPredicate(predicate, keysToFetch:keysToFetch)
self.tableView.reloadData()
}
catch {
print("Unable to refetch the selected contact.")
}
})
}
})
}
I używać:
let contacts = findContacts()
Apple ma prostszą próbki:
let store = CNContactStore()
let contacts = try store.unifiedContactsMatchingPredicate(CNContact.predicateForContactsMatchingName("Appleseed"), keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey])
do użytku z osobna, można spróbować zmodyfikować Sample firmy Apple tak:
//Use the reference to look up additional keys constants that you may want to fetch
let store = CNContactStore()
let contacts = try store.unifiedContactsMatchingPredicate(NSPredicate(value: true), keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey])
More Apple Samples for the Contacts Framework
Witam poniżej linii kodu daje imię, nazwisko, urodziny. ** niech keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactBirthdayKey, CNContactViewController.descriptorForRequiredKeys()] ** jeśli chcę odzyskać wszystkie szczegóły kontaktu, jak sprowadzić?. –