2016-04-18 10 views
5

Ich benötige die Anzahl aller Kontakte auf dem Gerät eines Benutzers. Die deprecation Nachricht auf ABAddressBookGetPersonCount sagt:CNContactStore Anzahl der Kontaktdatensätze

Verwendungsanzahl von Ergebnissen mit Prädikat für CNContactFetchRequest holen = nil

Hier ist, was ich dieser Anleitung folgende aus:

__block NSUInteger contactsCount = 0; 

NSError *error; 
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactGivenNameKey]]; 
BOOL success = [self.contactStore enumerateContactsWithFetchRequest:request error:&error 
                 usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) { 
                  contactsCount += 1; 
                 }]; 
if (!success || error) { 
    NSLog(@"error counting all contacts, error - %@", error.localizedDescription); 
} 

Doch das sieht schrecklich in Bezug auf die Leistung. Ich habe keine andere Möglichkeit gefunden, die Anzahl zu ermitteln, ohne CNContact-Objekte aufzuzählen. Fehle ich etwas?

Vielen Dank im Voraus!

+0

Wie ist Ihr Code so etwas wie die Anregung in der deprecation Nachricht? – trojanfoe

+0

Gibt es eine andere Möglichkeit, eine CNContactFetchRequest auszuführen? –

Antwort

2

Dies ist alt, aber falls jemand stolpert er, es kann mit 0 Tasten, indem Sie die Aufzählung erreicht werden, zu holen, anstatt 1.

__block NSUInteger contactsCount = 0; 

NSError *error; 
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[]]; 
BOOL success = [self.contactStore enumerateContactsWithFetchRequest:request error:&error 
                usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) { 
                 contactsCount += 1; 
                }]; 
if (!success || error) { 
    NSLog(@"error counting all contacts, error - %@", error.localizedDescription); 
} 

mit 0 Tasten, ich war in der Lage zu laufen die Zählung auf einem Gerät mit 10.000 Kontakten in 0,8 Sekunden (während es mit 1 Taste 14 Sekunden dauerte).

+0

Das ist eigentlich ein sehr guter Punkt! Ich wünsche immer noch, dass Apple eine legitime Möglichkeit hinzufügt, dies zu zählen. Ingurs eine einfache Cache-Eigenschaft wäre der einzig richtige Weg zu gehen. Nochmals vielen Dank für die Einsicht. –

0

Swift 3-Version, verpackt als eine Klassenfunktion.

class func contactCount() -> Int? { 
    let contactStore = CNContactStore() 
    var contactsCount: Int = 0 
    let contactFetchRequest = CNContactFetchRequest(keysToFetch: []) 
    do { 
     try contactStore.enumerateContacts(with: contactFetchRequest) { (contact, error) in 
     contactsCount += 1 
     } 
    } catch { 
     print("Error counting all contacts.\nError: \(error)") 
     return nil 
    } 

    return contactsCount 
} 

Oft ist es besser, einen Kontaktspeicher wieder zu verwenden, als eine andere erstellen ein:

class func contactCount(store: CNContactStore?) -> Int? { 
    let contactStore: CNContactStore 

    if let suppliedStore = store { 
     contactStore = suppliedStore 
    } else { 
     contactStore = CNContactStore() 
    } 

    var contactsCount: Int = 0 
    let contactFetchRequest = CNContactFetchRequest(keysToFetch: []) 
    do { 
     try contactStore.enumerateContacts(with: contactFetchRequest) { (contact, error) in 
     contactsCount += 1 
     } 
    } catch { 
     print("Error counting all contacts.\nError: \(error)") 
     return nil 
    } 

    return contactsCount 
}