2010-03-04 10 views
9

मैं कुछ समय के लिए आईफोन के एड्रेसबुक एपीआई का उपयोग कर रहा हूं। लेकिन एप्लिकेशन प्रदर्शन में सुधार करने के लिए कुछ रिफैक्टरिंग करना मैंने एड्रेसबुकक्रेट द्वारा लौटाए गए ABAddressBookRef को "पुन: उपयोग" करने का निर्णय लिया है क्योंकि मैंने देखा है कि ऐसा करने में बड़े प्रदर्शन सुधार हैं। हालांकि, मैं EXEC_BAD_ACCESS त्रुटियों हो रही है अब बेतरतीब ढंग से, और मुझे लगता है कि कारण यह "चेतावनी" iPhone संदर्भ कार्यान्वयन में में है: http://developer.apple.com/iphone/library/documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/300-BasicObjects/BasicObjects.html#//apple_ref/doc/uid/TP40007744-CH3-SW1आईफोन बहु थ्रेडेड एड्रेसबुक मैनिपुलेशन

महत्वपूर्ण: ABAddressBookRef के उदाहरण से अधिक थ्रेड द्वारा नहीं किया जा सकता है। प्रत्येक थ्रेड को ABAddressBookCreate को कॉल करके अपना स्वयं का उदाहरण बनाना चाहिए।

अब, मैंने सोचा कि इसका मतलब है कि यह थ्रेड-सुरक्षित नहीं था इसलिए मुझे एपीआई तक पहुंच सिंक्रनाइज़ करना पड़ा, लेकिन शायद मैं गलत हूं, और कुछ अन्य कारणों से कई धागे डेटा संरचना को गड़बड़ कर रहे हैं?

क्या कोई पुष्टि कर सकता है कि यह वास्तव में एक थ्रेड-सुरक्षित समस्या है (इसलिए @ सिंक्रनाइज़ेशन काम करना चाहिए) या कोई अन्य समस्या?

चीयर्स

उत्तर

11

यह एक धागा सुरक्षा मुद्दा नहीं है ... वहाँ आप ताले के साथ इसे हल करने के लिए कोई रास्ता नहीं है। टिप्पणी यह ​​बहुत स्पष्ट करता है:

महत्वपूर्ण: ABAddressBookRef के उदाहरण से अधिक थ्रेड द्वारा नहीं किया जा सकता है। प्रत्येक थ्रेड ABAddressBookCreate को कॉल करके अपना स्वयं का उदाहरण बनाना चाहिए।

आप क्या कर सकते हैं ABAddressBook का एक उदाहरण बनाते हैं और एक निर्माता/उपभोक्ता वास्तुकला बनाते हैं जो ऑब्जेक्ट तक पहुंच का प्रबंधन करेगा।

रैपर का मुख्य धागा होगा जो केवल एक चीज करता है: अवरुद्ध कतार से ऑपरेशन अनुरोध पढ़ता है, फिर पता पुस्तिका पर संचालन करता है। आपके सभी धागे अपने परिचालन को एकल कतार में कतार देंगे और रैपर उन कार्यों को निष्पादित करेगा; यदि कतार में कुछ भी नहीं है तो कतार में कुछ भी होने तक रैपर अवरुद्ध होगा।

यह एकाधिक धागे से ABAddressBookRef का उपयोग करने की अनुमति न देने की समस्या को हल करना चाहिए।

+0

हाय Lirik, हाँ, मैं इसी निष्कर्ष पर मिल गया है ... यह एक बहुत बुरा रास्ता एक AB ढांचे का निर्माण करने के लिए ईमानदारी से .. डेवलपर एक (अपेक्षाकृत) जटिल बहु समाधान का निर्माण करने के लिए छोड़ दिया जाता है की तरह लगता है एक सामान्य समस्या को हल करने के लिए जिसे आर्किटेक्टेड किया जाना चाहिए, लेकिन कोई क्या कर सकता है .. मुझे बड़ी बंदूकें में पहिया करना होगा और इसे कठिन तरीके से करना होगा .. धन्यवाद! – Marco

+0

दरअसल, मैंने आपके उत्तर को पढ़ने से पहले एक अलग समाधान बनाया था, जहां मैंने थ्रेड नामों के साथ एबीआरफ्स का एक शब्दकोश रखा था (बेवकूफ) कि आईफोन थ्रेडपूल से थ्रेड को रीसायकल करता है ... लेकिन हेलस, कोई पासा नहीं ... यह एक बनाता है हर बार जब आप एक को अलग करते हैं तो नया धागा ... इसलिए मैं अंत में आपके निष्कर्ष पर पहुंचा था – Marco

+0

@Lirik और @Marko, मुझे एक ही समस्या है। मैंने पहले से ही बहु-थ्रेडिंग समस्या देखी है और शुरुआत से ही एबी रैपर को लागू किया है। लेकिन मेरे पास अभी भी एक बड़ी बग है - कभी-कभी ऐप दुर्घटनाग्रस्त हो जाती है और कभी-कभी यह एबी से सभी संपर्कों को हटा देती है। मैंने ट्रिपल-चेक किया है कि एबी इंस्टेंस का उपयोग करने वाली सभी विधियां इसे इस रैपर द्वारा प्रबंधित थ्रेड से करती हैं। –