Acessando o Catálogo de Endereços iOS com Swift: contagem zero de matrizes

Estou tentando escrever um método simples para solicitar a um usuário acesso ao catálogo de endereços e depois imprimir o nome de cada pessoa no catálogo de endereços. Eu já vi vários tutoriais explicando como fazer isso no objetivo-C, mas estou tendo dificuldades para convertê-los para rápidos.

Aqui está o que eu fiz até agora. O bloco abaixo é executado no meu método viewDidLoad () e verifica se o usuário autorizou o acesso ao catálogo de endereços ou não, se ainda não o autorizou, a primeira instrução if solicitará acesso. Esta seção funciona conforme o esperado.

var emptyDictionary: CFDictionaryRef?

var addressBook: ABAddressBookRef?

        if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.NotDetermined)
        {
            println("requesting access...")
            addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil)
            ABAddressBookRequestAccessWithCompletion(addressBook,{success, error in
            if success {
                self.getContactNames();
            }
            else
            {
                println("error")
            }
        })
    }
        }
        else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Denied || ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Restricted)
        {
            println("access denied")
        }
        else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Authorized)
        {
            println("access granted")
            getContactNames()
        }

Depois que eu souber que o usuário concedeu acesso, eu executo o método getContactNames () que está abaixo. Depois de muito e muito tempo, finalmente consegui compilar isso adicionando o método takeRetainedValue () para converter a matriz retornada por ABAddressBookCopyArrayOfAllPeople de uma matriz não gerenciada em uma matriz gerenciada, isso me permite converter o CFArrayRef em um NSArray.

O problema que estou enfrentando é que a matriz contactList acaba tendo uma contagem de 0 e, portanto, o loop for é ignorado. No meu simulador, o catálogo de endereços tem 6 ou 7 registros, então eu esperaria que o array tivesse esse comprimento. Alguma ideia?

func getContactNames()
    {
        addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil)
        var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
        println("records in the array \(contactList.count)") // returns 0

        for record:ABRecordRef in contactList {
            var contactPerson: ABRecordRef = record
            var contactName: String = ABRecordCopyCompositeName(contactPerson).takeRetainedValue()
            println ("contactName \(contactName)")
        }
    }

Um ponto adicional - se eu usar o método ABAddressBookGetPersonCount, ele retornará -1.

 var count: CFIndex = ABAddressBookGetPersonCount(addressBook);
        println("records in the array \(count)") // returns -1

Com base neste linkABAddressBookGetPersonCount retorna -1 no iOS, parece que essa função retornando -1 pode estar relacionada à permissão não ser concedida, mas eu definitivamente solicitei permissão no código acima (e concedeu quando executo o aplicativo no simulador)

questionAnswers(9)

yourAnswerToTheQuestion