2012-10-08 20 views
19

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

कई साझा नियंत्रक हैं जो इस साझा उदाहरण का उपयोग करते हैं, और मेरा प्रश्न यह है कि डाउनलोड करने का अनुरोध करने वाले सही दृश्य नियंत्रक को वापस कैसे कॉल करें।

मेरा दृष्टिकोण प्रतिनिधिमंडल का उपयोग करना है, लेकिन समस्या यह है कि चूंकि अन्य व्यू कंट्रोलर भी इसके प्रतिनिधि हैं, डाउनलोड ऑब्जेक्ट प्रत्येक ऑब्जेक्ट पर वापस कॉल कर सकता है और यह ट्रैक करना मुश्किल होगा।

+2

डाउनलोड शुरू करने का अनुरोध डेटा के रिसीवर को पॉइंटर शामिल कर सकता है? फिर आप प्रत्येक अनुरोध के प्राप्तकर्ता पर प्रतिनिधि विधि को कॉल कर सकते हैं। – user1118321

+0

मैं इसी तरह की समस्या में भाग गया और तैयार समाधान पाया है https://github.com/aleph7/MultiDelegate –

उत्तर

42

मैंने उन परियोजनाओं पर काम किया है जहां लोगों ने कई प्रतिनिधियों का उपयोग करने का प्रयास किया है और यह मूल रूप से एक बुरा विचार है। प्रतिनिधि पैटर्न एक वर्ग और उसके प्रतिनिधि के बीच 1 से 1 रिश्ते के बारे में है। जबकि प्रतिनिधियों को अंदर और बाहर स्विच करके कई प्रतिनिधिमंडल के कुछ स्तरों को हासिल करना संभव है, यह अप्रत्याशित व्यवहार और बग का कारण बनने की अधिक संभावना है।

मेरी सिफारिश यह बदलनी होगी कि आप इसके बारे में क्या सोच रहे हैं।

  1. एक पर्यवेक्षक पैटर्न जहां कई पर्यवेक्षकों जो अपने मुख्य वर्ग के साथ बातचीत कर सकते हैं रजिस्टर कर सकते हैं पर स्विच करें, के रूप में मैं इसे देख आप दो विकल्प हैं। यह उपयोगी है जहां आपके पर्यवेक्षक सभी एक ही प्रोटोकॉल को लागू करते हैं और जहां आपका मुख्य वर्ग पर्यवेक्षकों और उनके साथ बातचीत के बारे में जागरूक होना चाहता है।

  2. राज्य परिवर्तन और घटनाओं को इंगित करने के लिए एनएसएनोटिफिकेशन प्रसारित करें। यहां एक और निर्णायक दृष्टिकोण है क्योंकि मुख्य वर्ग को यह जानने की आवश्यकता नहीं है कि कौन सुन रहा है और सीधे उनके साथ बातचीत नहीं करता है। अन्य अपने अवकाश में अधिसूचित होने शुरू और बंद कर सकते हैं। यह भी लाभ है कि आपको एक अलग प्रोटोकॉल बनाने या लागू करने की आवश्यकता नहीं है। इसके बजाय आप उन कक्षाओं को पंजीकृत करते हैं जिन्हें NSNotificationCenter के साथ परिवर्तनों के बारे में जानने की आवश्यकता होती है जो बदले में आपके लिए अधिसूचनाओं के सभी रूटिंग को संभालती है।

+3

व्याख्या करने के लिए धन्यवाद। NSNotification मेरे लिए खूबसूरती से काम किया। – guptron

+0

थोड़ा देर हो चुकी है, लेकिन समान समस्या वाले लोगों के लिए: प्रकाशक/ग्राहक पैटर्न – salocinx

10

यह वास्तव में लगता है कि प्रतिनिधि पैटर्न यहां सबसे अच्छा तरीका नहीं हो सकता है।

मैं इसके बजाय NSNotificationCenter पर देखता हूं।

मूल विचार यह है कि आपका सिंगलटन नेट कनेक्शन कर रहा है अधिसूचना पोस्ट करता है (postNotificationName:object:userInfo: जैसे कुछ के साथ), यह कहकर कि नया डेटा उपलब्ध है। इस अधिसूचना के भीतर, आप एक शब्दकोश ऑब्जेक्ट (userInfo) पास कर सकते हैं जिसमें आपके द्वारा प्राप्त डेटा है, या आपके मॉडल के किन हिस्सों में अपडेट किए गए डेटा में जानकारी है।

फिर, आपके अन्य व्यू नियंत्रक addObserver:selector:name:object: पर कॉल करके इन अधिसूचनाओं को 'निरीक्षण' करने के लिए स्वयं पंजीकृत कर सकते हैं। आम तौर पर, जब एक वीसी दिखाई देता है तो मैं addObserver पर कॉल करता हूं, और removeObserver जब यह छुपाया जा रहा है या संक्रमण हो रहा है।

शुभकामनाएं!

0

प्रतिनिधिमंडल इस समस्या के सही समाधान की तरह प्रतीत नहीं होता है। एक ऑब्जेक्ट (इसके स्वयं) और एक चयनकर्ता को पूर्णता अधिसूचना के रूप में कॉल करने के लिए एक चयनकर्ता प्रदान करने के लिए अनुरोध करने वाले दृश्य नियंत्रक की आवश्यकता के बारे में कैसे? बेशक, डाउनलोड पूर्ण होने तक आपको उस ऑब्जेक्ट और चयनकर्ता को स्टोर करने के लिए एक स्थान की आवश्यकता होगी। उम्मीद है कि इसके लिए आपके पास एक वस्तु है (या बना सकता है)।

+1

देखें, आप सफलता ब्लॉक का भी उपयोग कर सकते हैं। – fabb

0

मैं इन तरीकों

से एक का उपयोग करने की सलाह देते

पर्यवेक्षक:

जब उपयोग डेटा है कि आप अन्य वस्तु सूचित करना चाहते हैं उदाहरण ones.for आदिम के पास हैं जब आप उपयोग कर रहे हैं 'NSMutableArray' मानक लागू किया पैटर्न कम से कम आप अपने आप के लिए एक लागू करने की आवश्यकता है कि पुन: प्रयोज्य नहीं है द्वारा वस्तु में से एक में परिवर्तन को सूचित नहीं किया जा सकता है कि इतना

अधिसूचना

जब गंतव्य ऑब्जेक्ट (जिन्हें सूचित करने की आवश्यकता है) के साथ आपकी बातचीत एक-तरफ है। इसका मतलब है कि आपको उनसे किसी भी पावती या अन्य डेटा की आवश्यकता नहीं है।

प्रतिनिधि

जब वहाँ एक वस्तु हर बार कदम पर सूचित करने के लिए है।

ध्यान दें: सफलता के लिए ब्लॉक का उपयोग करें और असफल इसके बारे में कार्य क़तार में डेटा प्रसारित करने के लिए जब आप नहीं जानते कि जब वे खत्म कर रहे हैं या नेटवर्क संचालन तरह नाकाम रहने के एक पैटर्न नहीं है

संपादित करें: how to create notification | multi delegate issues and implementation

0

जबकि मैं यहां अधिकांश उत्तरों से सहमत हूं, यदि आप वास्तव में कई प्रतिनिधियों को प्राप्त करना चाहते हैं तो आप संभावित रूप से प्रतिनिधियों की एक श्रृंखला घोषित कर सकते हैं और उस सरणी के सभी प्रतिनिधियों को संदेश भेज सकते हैं। यदि आपके प्रोटोकॉल में वैकल्पिक प्रतिनिधि विधियां हैं, तो आप सुरक्षित रूप से का उपयोग करके आमंत्रित करते हैं (स्मृति प्रबंधन के प्रति सावधान रहना, क्योंकि उन प्रतिनिधियों को सरणी में दृढ़ता से संदर्भित किया जाएगा)। फिर मैं सहमत हूं कि कई प्रतिनिधियों की संभावना एक खराब वास्तुशिल्प विचार है और ब्लॉक या अधिसूचना केंद्र का उपयोग आपकी आवश्यकताओं के अनुरूप बेहतर होगा।