2016-04-18 17 views
5

Bir kullanıcının cihazındaki tüm kişilerin sayısını bilmem gerekiyor. ABAddressBookGetPersonCount üzerinde kullanımdan kaldırılması mesajı diyor: aitCNContactStore Temas kayıtlarının sayısı

kullanım sayımı Burada

nil = yüklemi CNContactFetchRequest sonuçlarını getirme O rehberlik aşağıdaki oluşur neyi edilir:

__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); 
} 
Ancak

bu bakışlar performans açısından korkunç. CNContact nesnelerini numaralandırmadan sayımı elde etmenin başka bir yolunu bulamadım. Bir şey mi eksik?

şimdiden teşekkür ederiz!

+0

nasıl kullanımdan kaldırılması mesajında ​​öneri gibi kod bir şey mi? – trojanfoe

+0

CNContactFetchRequest'i yürütmenin başka bir yolu var mı? –

cevap

2

Bu eski, ama bunun üzerine dava başkasının tökezlemeleri içinde, 0 tuşları ile yerine 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); 
} 

getirme 0 tuşlarıyla numaralandırma yaparak gerçekleştirilebilir, ben çalıştırmak başardı 0,8 saniyede 10.000 kişi ile bir cihaz üzerinde sayım (1 tuş ile 14 saniye sürdü).

+0

Bu aslında çok iyi bir nokta! Hala Apple'ın bu sayıma sahip olması için yasal bir yol eklemesini dilerim. Ingurss basit bir önbellek özelliği gitmek için tek uygun yol olurdu. İçgörü için tekrar teşekkürler. –

0

Swift 3 sürümü, Sınıf işlevi olarak paketlenmiştir. Genellikle

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 
} 

yaratmak daha bir temas mağaza tekrar kullanılması daha iyi olacaktır diğeri:

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 
} 
İlgili konular