2011-09-19 35 views
6

मेरे पास एक ऐप है जो कभी-कभी ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() द्वारा लौटाए गए सरणी के कारण दुर्घटनाग्रस्त हो जाता है, जिसमें ABAddressBookGetPersonCount() के लिए एक अलग आकार होता है। कोड का खोल नीचे दिखाया गया है। आम तौर पर nPeople सरणी के समान आकार है। हालांकि, एक उपयोगकर्ता के आईफोन पर (या कम से कम, जैसा कि एक उपयोगकर्ता द्वारा रिपोर्ट किया गया है), nPeople लगभग दोगुनी है। मैं ABAddressBookGetPersonCount() के बजाय सरणी आकार का उपयोग करके क्रैश को रोक सकता हूं। हालांकि, मुझे यकीन नहीं है कि इसका मतलब है कि मैं आईफोन में सभी संपर्कों तक नहीं पहुंच रहा हूं।ABAddressBookCopyArrayOfAllPeople और ABAddressBookGetPersonCount विभिन्न आकारों को वापस लौटाएं

  • क्या कोई इस मुद्दे पर पहले आया है?
  • संख्याएं अलग क्यों होंगी?

मुझे आश्चर्य हुआ कि समूह में संग्रहीत संपर्कों के साथ ऐसा कुछ करना था (मुझे नहीं पता कि समूह हैं - केवल एक विचार)। इसके अलावा, उपयोगकर्ता के ईमेल पते से, मुझे संदेह है कि वे मोबाइलमे का उपयोग करते हैं। मुझे आश्चर्य हुआ कि क्या मोबाइलमे के साथ समन्वय एक अलग रिकॉर्ड आईडी के साथ डुप्लिकेट बनाएगा, लेकिन मौजूदा संपर्क को हटा नहीं सकता है, कम से कम जहां तक ​​ABAddressBookGetPersonCount() जाता है।

संपादित करें: मैंने इसमें कुछ और देखा है और समस्या के कारण काफी अच्छा विचार है। चूंकि मैं संपर्कों की एक क्रमबद्ध सरणी चाहता था, मैंने ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() का उपयोग किया। इसके लिए एक पता पुस्तिका स्रोत की आवश्यकता है - मैंने डिफ़ॉल्ट स्रोत का उपयोग किया था। मेरा मानना ​​है कि विभिन्न स्रोत हो सकते हैं - स्थानीय स्रोत और अन्य जैसे एक्सचेंज और मोबाइलमे। इसलिए, मेरी सरणी केवल स्थानीय संपर्कों के साथ खत्म हो जाएगी, जबकि ABAddressBookGetPersonCount() द्वारा लौटाई गई संख्या में सभी स्रोत शामिल होंगे - इसलिए मेरा क्रैश। इसलिए, मुझे लगता है कि मेरे ऐप में स्थानीय डेटा के साथ काम करना बेहतर होगा और ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering द्वारा वापस किए गए सरणी आकार का उपयोग ABAddressBookGetPersonCount के बजाय किया जाएगा।

CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName); 

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

    for (int i = 0; i < nPeople; i++) 
    { 
     ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i); 
    } 

उत्तर

13

ABAddressBookGetPersonCount और ABAddressBookCopyArrayOfAllPeople अलग सरणियों देता है।

ABAddressBookGetPersonCount - पता पुस्तिका में व्यक्ति रिकॉर्ड की संख्या देता है। ABAddressBookCopyArrayOfAllPeople - एक पता पुस्तिका में सभी व्यक्ति रिकॉर्ड लौटाता है।

तो कुछ बार एक ही व्यक्ति के पास अतिरिक्त रिकॉर्ड हो सकते हैं। यही कारण है कि आप विभिन्न आकार प्राप्त कर सकते हैं।

+0

जिसका अर्थ है ABAddressBookGetPersonCount हमेशा ABAddressBookCopyArrayOfAllPeople से कम होना चाहिए? –

+0

यह निर्भर करता है। यदि अलग-अलग व्यक्ति के पास अतिरिक्त रिकॉर्ड हो तो यह अलग होगा। अगर प्रत्येक व्यक्ति के पास एक संपर्क नंबर है। तो दोनों एक ही होंगे। :) @NikitaP –

9

आज मैं इस समस्या को पूरा करता हूं। मेरा ऐप कुछ विशेष iDevices में भी दुर्घटनाग्रस्त हो जाता है।

कोड:

ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook); 
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName); 

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

    for (int i = 0; i < nPeople; i++) { 
     ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 
     // more thing with `person` 
    } 

लेकिन यह कभी कभी दुर्घटना होगा। कुछ ब्रेकपॉइंट्स जोड़कर मैंने पाया कि allPeople की गणना nPeople से कम है।

गुगल करके, मुझे this article मिला। मैंने पाया कि शायद ABAddressBookCopyDefaultSource के साथ कुछ गड़बड़ है। यहां मुझे डिफ़ॉल्ट स्रोत मिला, मुझे सभी स्रोत प्राप्त करना होगा।

कोड:

CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); 

CFIndex sourceCount = CFArrayGetCount(sources); 

for (CFIndex i = 0; i < sourceCount; i++) { 
    ABRecordRef currentSource = CFArrayGetValueAtIndex(source, i); 
    int sourceType = [(__bridge NSNumber *)ABRecordCopyValue(currentSource, kABSourceTypeProperty) intValue]; 
    switch (sourceType) { 

     case kABSourceTypeCardDAV: 
      NSLog(@"kABSourceTypeCardDAV"); 
      break; 

     case kABSourceTypeCardDAVSearch: 
      NSLog(@"kABSourceTypeCardDAVSearch"); 
      break; 

     case kABSourceTypeExchange: 
      NSLog(@"kABSourceTypeExchange"); 
      break; 

     case kABSourceTypeExchangeGAL: 
      NSLog(@"kABSourceTypeExchangeGAL"); 
      break; 

     case kABSourceTypeLDAP: 
      NSLog(@"kABSourceTypeLDAP"); 
      break; 

     case kABSourceTypeLocal: 
      NSLog(@"kABSourceTypeLocal"); 
      break; 

     case kABSourceTypeMobileMe: 
      NSLog(@"kABSourceTypeMobileMe"); 
      break; 

     default: 
      break; 
    } 
    CFArrayRef allPeopleInSource = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, currentSource, kABPersonSortByLastName); 
    NSLog(@"Count of allPeopleInSource: %i", CFArrayGetCount(allPeopleInSource)); 
} 

तब मैं

kABSourceTypeCardDAV 
    Count of allPeopleInSource: 7 

जिसका अर्थ है वहाँ केवल एक ही स्रोत और है कि स्रोत में केवल 7 रिकॉर्ड है मिला है।

लेकिन मेरी पता पुस्तिका में, मेरे पास 79 संपर्क हैं!

फिर मैंने गलती की।

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, sources, kABPersonSortByLastName); 

allPeople में कितने सदस्य: मैं सिर्फ इस तरह ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering करने के लिए sources पारित कर दिया,?

72 !!!

सटीक रूप से उन रिकॉर्ड की गिनती जो sources में नहीं हैं।

मैंने दूसरे पैरामीटर के रूप में ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering पर एक CFArrayRef पारित किया, जो ABRecordRef की अपेक्षा करता है। अगर मैं nil पास करता हूं तो क्या होगा?

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, kABPersonSortByLastName); 

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

    for (int i = 0; i < nPeople; i++) { 
     ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 
     // more thing with `person` 
    } 

अब मैं अपने पता पुस्तिका में संपर्क के सभी प्राप्त कर सकते हैं:

अंत में, मैं कोड मिला है।

यह मेरे सभी iDevices पर ठीक काम करता है!

मैं बारे में मेरी गरीब अंग्रेज़ी बहुत माफी चाहता हूँ ...

उम्मीद है, इस सवाल का जवाब आप कर सकते हैं।

नोट: अब मुझे समझ नहीं आता कि वास्तव में पतापुस्तिका में source क्या है, किसी को भी मेरी मदद कर सकते हैं?

+0

अच्छा जवाब। कभी-कभी आपके पता पुस्तिका में सभी संपर्क एक स्रोत से नहीं हो सकते हैं। यह फेसबुक, विभिन्न जीमेल इत्यादि से हो सकता है .. तो यदि आप कोई स्रोत निर्दिष्ट नहीं करते हैं तो आपको सभी संपर्क मिलते हैं। – Kaey

3

@ जॉकीनरीउ त्सुई पासिंग स्रोत शून्य के रूप में कुंजी था, धन्यवाद! ऐसा लगता है कि स्रोत प्रकार इस दस्तावेज़ से ऐप्पल से मेल खाते हैं: https://developer.apple.com/library/ios/documentation/AddressBook/Reference/ABSourceRef_iPhoneOS/#//apple_ref/doc/constant_group/Source_Types