2016-12-23 2 views
0
func getContacts() { 
    let store = CNContactStore() 

    if CNContactStore.authorizationStatus(for: .contacts) == .notDetermined { 
     store.requestAccess(for: .contacts, completionHandler: { (authorized: Bool, error: NSError?) -> Void in 
      if authorized { 
       self.retrieveContactsWithStore(store: store) 
      } 
     } as! (Bool, Error?) -> Void) 
    } else if CNContactStore.authorizationStatus(for: .contacts) == .authorized { 
     self.retrieveContactsWithStore(store: store) 
    } 
} 

func retrieveContactsWithStore(store: CNContactStore) { 
    do { 
     let groups = try store.groups(matching: nil) 
     let predicate = CNContact.predicateForContactsInGroup(withIdentifier: groups[0].identifier) 
     //let predicate = CNContact.predicateForContactsMatchingName("John") 
     let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactEmailAddressesKey] as [Any] 

     let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch as! [CNKeyDescriptor]) 
     self.objects = contacts 
     DispatchQueue.main.async(execute: {() -> Void in 
      self.myTableView.reloadData() 
     }) 
    } catch { 
     print(error) 
    } 
} 

J'essayais de récupérer les contacts du carnet d'adresses, mais chaque fois que je me rendais à la vue appelant getContacts(), l'application se figeait. Ça ne marcherait plus, mais ça ne s'est pas écrasé non plus. Je me demande ce qui a mal tourné ici?L'application se bloque lors de la demande d'accès au carnet d'adresses

Répondre

1

Votre code pour l'appel à requestAccess est incorrect. La syntaxe du gestionnaire d'achèvement n'est pas valide. Vous en avez besoin:

func getContacts() { 
    let store = CNContactStore() 

    let status = CNContactStore.authorizationStatus(for: .contacts) 
    if status == .notDetermined { 
     store.requestAccess(for: .contacts, completionHandler: { (authorized: Bool, error: Error?) in 
      if authorized { 
       self.retrieveContactsWithStore(store: store) 
      } 
     }) 
    } else if status == .authorized { 
     self.retrieveContactsWithStore(store: store) 
    } 
} 

Notez également le changement d'utiliser la variable status. C'est plus propre et plus facile à lire qu'appeler authorizationStatus encore et encore. Appelez-le une fois, puis vérifiez la valeur encore et encore au besoin.

+0

ce code a une erreur sur le statut d'autre ==. Partie autorisée, il dit "fixer l'insérer", "" –

+0

Oups. J'ai plus édité. Ajoutez un 'if' là-dedans. Voir la mise à jour. – rmaddy

+0

Et une autre faute de frappe - raté la parenthèse fermante. – rmaddy