Búsqueda lenta de contactos utilizando el marco de contactos

Estoy usando Xcode 7.3 y Swift 2.2. Estoy tratando de search todos los contactos del dispositivo y almacenarlos en una matriz. Funciona bien en el simulador pero es muy lento cuando se testing en el dispositivo (con 378 contactos). Se tarda unos 20-25 segundos en hacerlo. Puse varios puntos de interrupción y noté que search contactos desde el teléfono toma el time máximo. Mostrar los contactos de la matriz creada con una vista de tabla no toma time en absoluto. Aquí está mi código,

var results: [CNContact] = [] func retrieveContactsWithStore() { let contactStore = CNContactStore() var i = 0 var allContainers: [CNContainer] = [] do { allContainers = try contactStore.containersMatchingPnetworkingicate(nil) } catch { print("Error fetching containers") } for container in allContainers { let fetchPnetworkingicate = CNContact.pnetworkingicateForContactsInContainerWithIdentifier(container.identifier) do { let containerResults = try contactStore.unifiedContactsMatchingPnetworkingicate(fetchPnetworkingicate, keysToFetch: [ CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]) results.appendContentsOf(containerResults) } catch { print("Error fetching results for container") } } 

Y así es como estoy llenando mi vista de tabla.

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) cell.textLabel?.text = results[indexPath.row].givenName cell.detailTextLabel?.text = ((results[indexPath.row].phoneNumbers[0].value as? CNPhoneNumber)?.valueForKey("digits") as? String) return cell } 

En el Debug Navigator también la CPU sube al 98-99%, Energy Impact – Very High. Estos regresan a los valores normales una vez que se han obtenido los contactos.

Resulta que get CNContactPhoneNumbersKey lleva mucho time. Simplemente search CNContactGivenNameKey es rápido (2-3 segundos). ¿Tenemos una solución para esto?

No hay nada malo con el Framework o el código. Probé el código en otros dispositivos y allí funcionó bien. Fue capaz de search cerca de 900 contactos en less de un segundo.

Así que el problema era específico del dispositivo y la reinstallation de iOS y la restauración del dispositivo como un nuevo iPhone resolvió el problema.

Si alguien más enfrenta un problema similar, simplemente haga una copy de security de sus cosas importantes (por ejemplo, contactos, fotos, etc.) y reinstale iOS y restaure el dispositivo como un nuevo iPhone.