2012-06-15 26 views
5

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

उत्तर

1

निर्भर करता है कि कैसे आप डाउनलोड के साथ काम कर रहे हैं - अगर आप NSURLConnection का उपयोग कर रहे यह आप के लिए अलग सूत्रण/संगामिति संभालती है और अपने कोड रैत्रांत है इस प्रकार आप एक साथ कार्रवाई के बारे में चिंता करने की जरूरत नहीं है। यदि आप अपने स्वयं के धागे बना रहे हैं तो आपको संभावित रूप से समस्याएं हैं।

संपादित करें: आपका कोड मुख्य थ्रेड (मुख्य रन लूप) में चलता है, मान लें कि आपके पास एक NSURLConnection है जो चल रहा है तो यह एक अलग थ्रेड में चलाएगा। हालांकि आपका प्रतिनिधि कोड जो कनेक्शन के चलते होने वाली घटनाओं से संबंधित है, आपके रन लूप में चलता है, न कि अन्य थ्रेड में। इसका मतलब है कि आपका कोड एक समय में केवल एक ही चीज़ निष्पादित कर सकता है। एक कनेक्शन सफल विधि को पर एक ही समय में नामक अन्य कोड के रूप में नहीं कहा जाएगा। यदि आपके पास लूप चलाना था तो यह आपके मुख्य थ्रेड को तब तक अवरुद्ध कर देगा जब तक कि यह लूपिंग समाप्त नहीं हो जाता है, इस बीच यदि लूप अभी भी चल रहा है, तो कनेक्शन समाप्त हो गया है, तो लूप समाप्त होने के बाद तक आपका प्रतिनिधि कोड निष्पादित नहीं होगा।

+0

हाँ, मैं NSURLConnection उपयोग कर रहा हूँ। आइए कल्पना करें कि हमारे पास एक म्यूटेबल सरणी पर एक चक्र है, यह तब होता है जब कोई अन्य कार्य (कनेक्शन सफल हुआ) सरणी के अंत में ऑब्जेक्ट जोड़ने की कोशिश करता है, जबकि चक्र निष्पादित हो रहा है? क्या आप इस मामले में पुनर्वित्त कोड का संक्षिप्त उदाहरण दे सकते हैं? – user236739

+0

कुछ और वाक्य जोड़े गए – Gruntcakes

+0

कूल, ये नई लाइनें जहां वास्तव में स्पष्टीकरण, धन्यवाद। – user236739

1

आप ग्रांड सेंट्रल डिस्पैच (जीसीडी) और बाधा ब्लॉक में देखना चाहते हैं। बैरियर ब्लॉक आपको पृष्ठभूमि में जो कुछ भी चाहिए और "लॉक" संसाधनों को करने की अनुमति देगा।

जीसीडी पर ऐप्पल प्रलेखन और माइक ऐश के ब्लॉग पोस्ट here देखें।

मूलभूत बात यह है कि आप एक समवर्ती कतार का उपयोग करते हैं जिसे आप पढ़ने के लिए बनाते हैं और लिखने के लिए उस संसाधन की सभी पहुंच को अवरुद्ध करने के लिए बाधा ब्लॉक का उपयोग करते हैं। अच्छी चीज़।

गुड लक

टिम