2009-09-05 14 views
38

में एकाधिक प्रतिनिधियों मैं सी # घटना मॉडल से आ रहा हूं, और मुझे आश्चर्य है कि किसी घटना के कई प्रतिनिधियों को सूचित करने का मानक तरीका है या नहीं?उद्देश्य सी

मेरे पास क्लाससीडियेट प्रोटोकॉल है जो मैं कक्षा और कक्षा दोनों को कार्यान्वित करना चाहता हूं। क्या कोई तरीका है कि मैं कक्षासी और कक्षाबी दोनों को कक्षासी के भीतर प्रतिनिधि चर के सूची मैन्युअल रूप से बनाने के बिना प्रतिनिधियों के रूप में क्लास के रूप में आवंटित कर सकता हूं?

उत्तर

73

कोको प्रतिनिधियों का उपयोग नियंत्रण में उलझन को पूरा करने और उप-वर्गीकरण की आवश्यकता को कम करने के लिए किया जाता है। एक ही ऑब्जेक्ट के लिए कई प्रतिनिधि होने के लिए पूरी तरह से संभव है, लेकिन यह तब किया जाता है जब विभिन्न वस्तुओं के विभिन्न प्रकार के निर्णयों को प्रस्तुत करने के लिए यह समझ में आता है। इसका एक शानदार उदाहरण वेबकिट से WebView है, जिसमें पांच प्रतिनिधि प्रतिनिधि संसाधन लोडिंग और नेविगेशन नीति के रूप में विविध क्षेत्रों के लिए ज़िम्मेदार हैं।

सी # की घटना-प्रतिनिधि प्रणाली, जो किसी ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट के साथ पंजीकृत करने की अनुमति देती है, जब कोई विशेष घटना होती है, तो कोको से उपलब्ध कई अधिसूचना एपीआई के सबसे नज़दीक है। विभिन्न एपीआई आप के पार चला सकता है, कर रहे हैं उच्चतम स्तर से सबसे कम करने के लिए:

  • NSNotificationCenter
  • NSDistributedNotificationCenter
  • CFNotificationCenter
  • डार्विन सूचनाएं।

सभी भावनाओं में समान हैं, इसलिए मैं केवल इस मामले में उपयोग करने वाले व्यक्ति पर विचार करूंगा: NSNotificationCenter

क्लासए और कक्षाबी जैसे पर्यवेक्षक, NSNotificationCenter के साथ अधिसूचनाओं में अपनी रुचि पंजीकृत करते हैं। वे एक खास नाम वाली

  • अधिसूचना में रुचि एक विशिष्ट वस्तु से एक खास नाम वाली
  • सूचनाएं किसी भी वस्तु से
  • सूचनाएं एक विशेष वस्तु से निर्दिष्ट कर सकते हैं।

जब अधिसूचना केंद्र पर एक मेलिंग अधिसूचना पोस्ट की जाती है, तो पर्यवेक्षकों को अधिसूचना केंद्र के साथ पंजीकरण समय पर प्रदान की गई विधि का आह्वान करके अधिसूचित किया जाता है। विधि में हमेशा एक ही प्रकार होता है: यह कुछ भी नहीं देता है और एक एकल तर्क स्वीकार करता है, NSNotification ऑब्जेक्ट।इस तरह के ClassA और ClassB, के रूप में

आप आम तौर पर ClassC अपने हेडर फाइल में अधिसूचना नाम के लिए एक निरंतर घोषित, उदाहरण के लिए होने से अपनी स्थिति को संभाल होगा,

extern NSString *const ClassCSomethingDidHappenNotification; 

इच्छुक पर्यवेक्षकों, तो इस में रुचि रजिस्टर कर सकते हैं अधिसूचना:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(handleSomethingDidHappen:) 
     name:ClassCSomethingDidHappenNotification     
     object:aClassCObject]; 

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

जब अधिसूचना के साथ जुड़े घटना होती है, ClassC पदों अधिसूचना केंद्र के लिए अधिसूचना:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:ClassCSomethingDidHappenNotification 
       object:self]; 

अधिसूचना केंद्र तो पर्यवेक्षकों की सूची के माध्यम दिखेगा, जो इस अधिसूचना से मेल खाते हैं, और आह्वान उचित विधि वे नहीं के रूप में प्रतिनिधियों कर सकते हैं, वापस जानकारी भेज सकते हैं -

+1

अधिसूचनाओं और प्रतिनिधियों से उनकी समानताओं और मतभेदों के लिए उत्कृष्ट परिचय। –

+1

सहमत, इस प्रतिनिधियों और सूचनाएं (श्रोताओं) का एक बहुत अच्छा बहुविकल्पी है। यह कुछ हद तक एक अस्पष्ट रेखा है (उदाहरण के लिए, हम प्रायः असीमित कार्यों को पूरा करने के बारे में प्रतिनिधियों को सूचित करते हैं) लेकिन यह भेद को समझने का भुगतान करता है। –

2

आपके पास केवल एक प्रतिनिधि वस्तु हो सकती है। यदि आप परिवर्तनों की विभिन्न वस्तुओं को सूचित करना चाहते हैं तो आपको NSNotificationCenter का उपयोग करना चाहिए और NSNotification संदेशों को पोस्ट करना चाहिए जिनके लिए आपकी ऑब्जेक्ट्स सुन सकते हैं।

+9

वास्तव में, इस सम्मेलन, लेकिन नहीं एक सख्त सीमा नहीं है। हर कोई केवल 'सेट डिलीगेट:' विधि के बारे में सोचता है, लेकिन असीमित लचीलापन है। –

3

आप एक ऑब्जेक्ट भी ईवेंट को संभाल सकते हैं और फिर उसे दूसरी ऑब्जेक्ट पर अग्रेषित कर सकते हैं।

3

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

10

सूचना केंद्र के लिए एक वैकल्पिक पर संदेश, पोस्टिंग में विस्तृत अग्रेषित करने के लिए एक NSProxy उपवर्ग उपयोग करने के लिए है:

https://github.com/hoteltonight/HTDelegateProxy

+0

ग्रेट उत्तर, धन्यवाद! – jonsibley