2016-04-18 9 views
5

मुझे उपयोगकर्ता के डिवाइस पर सभी संपर्कों की संख्या प्राप्त करने की आवश्यकता है। ABAddressBookGetPersonCount पर प्रतिवाद संदेश का कहना है: केसंपर्क रिकॉर्ड की CNContactStore गिनती

उपयोग गिनती विधेय के साथ CNContactFetchRequest लिए लाने का परिणाम शून्य

यहाँ = क्या मुझे लगता है कि मार्गदर्शन निम्नलिखित बना है:

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

हालांकि इस दिखता है प्रदर्शन के मामले में भयानक। मुझे CNContact ऑब्जेक्ट्स को गिनने के बिना गिनती प्राप्त करने का एक और तरीका नहीं मिला है। क्या मैं कुछ भूल रहा हूँ?

अग्रिम धन्यवाद!

+0

कैसे प्रतिवाद संदेश में सुझाव की तरह अपने कोड कुछ भी है? – trojanfoe

+0

क्या CNContactFetchRequest निष्पादित करने का कोई और तरीका है? –

उत्तर

2

यह पुरानी है, लेकिन इस पर मामला किसी और stumbles में, यह करने के बजाय 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); 
} 

लाने के लिए 0 कुंजी के साथ 0 कुंजी के साथ गणना करके पूरा किया जा सकता है, मैं चलाने के लिए सक्षम था 0.8 सेकंड में 10,000 संपर्क वाले डिवाइस पर गिनती (जबकि इसमें 1 सेकंड के साथ 14 सेकंड लग गए)।

+0

यह वास्तव में एक बहुत अच्छा मुद्दा है! मैं अब भी चाहता हूं कि ऐप्पल इस गिनती के लिए एक कानूनी तरीका जोड़ें। Ingurss एक साधारण कैश संपत्ति जाने का एकमात्र उचित तरीका होगा। अंतर्दृष्टि के लिए फिर से धन्यवाद। –

0

स्विफ्ट 3 संस्करण, क्लास फ़ंक्शन के रूप में पैक किया गया।

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 
} 

अक्सर यह एक संपर्क दुकान पुन: उपयोग करने से बनाने के बेहतर होगा एक और एक:

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 
} 
संबंधित मुद्दे