2015-10-26 4 views
6

Próbuję wstawić do var contacts: [CNContact] = [] var store = CNContactStore() ale nie mogę znaleźć odpowiedniego kodu dla tej pracy, znalazłem tę funkcję, że muszę dać, że nazwajak sprowadzaniu wszystkie CNContactStore z urządzenia bez filtra

func findContactsWithName(name: String) { 
    AppDelegate.sharedDelegate().checkAccessStatus({ (accessGranted) -> Void in 
     if accessGranted { 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       do { 
        let predicate: NSPredicate = CNContact.predicateForContactsMatchingName(name) 
        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.") 
       } 
      }) 
     } 
    }) 
} 

chcę wstawić self.contacts wszystkie rekordy, a nie tylko jedną z nazwą równego

+0

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ć?. –

Odpowiedz

8

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).

CNContactFetch-Predicate

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

+2

jestem geting Zakończenie aplikację spowodowane nieprzechwyconego wyjątku „CNInvalidPredicateException”, uzasadnienie: „Predykat TRUEPREDICATE nie jest poprawnym Kontakt predicat – shaharnakash

+0

@shaharnakash - Zobacz próbkę CNContactFetchRequest dostarczone. Proszę dać mi znać, czy to działa w twoim przypadku? –

+0

C teraz jego pracy, używam jak sugerujesz niech fetchRequest = CNContactFetchRequest (keysToFetch: keysToFetch) i teraz wszystko idealne :) – shaharnakash

8

Modified odpowiedź Tommie c dla XCode 8 & Swift 3.0.

func findContactsOnBackgroundThread (completionHandler:@escaping (_ contacts:[CNContact]?)->()) { 

    DispatchQueue.global(qos: .userInitiated).async(execute: {() -> Void in 

     let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName),CNContactPhoneNumbersKey] as [Any] //CNContactIdentifierKey 
     let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch as! [CNKeyDescriptor]) 
     var contacts = [CNContact]() 
     CNContact.localizedString(forKey: CNLabelPhoneNumberiPhone) 

     if #available(iOS 10.0, *) { 
      fetchRequest.mutableObjects = false 
     } else { 
      // Fallback on earlier versions 
     } 
     fetchRequest.unifyResults = true 
     fetchRequest.sortOrder = .userDefault 

     let contactStoreID = CNContactStore().defaultContainerIdentifier() 
     print("\(contactStoreID)") 


     do { 

      try CNContactStore().enumerateContacts(with: 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) 
     } 

     DispatchQueue.main.async(execute: {() -> Void in 
      completionHandler(contacts) 

     }) 
    }) 
} 

override func viewDidLoad() { 
    findContactsOnBackgroundThread { (contacts) in 
      self.contactsList = contacts 
      self.tableView.reloadData() 
     } 
} 
Powiązane problemy