2013-06-11 8 views
17

मैं NSNotificationCenter के साथ खेल रहा हूं और मैं सोच रहा हूं कि आप defaultCenter के बजाय अपने स्वयं के कस्टम अधिसूचना केंद्र का उपयोग कब करेंगे? और इसका क्या फायदे होगा?कस्टम NSNotificationCenter कब बनाएं?

मेरी अज्ञानता को क्षमा करें, लेकिन ऐसा लगता है कि मैं defaultCenter और कुछ और नहीं कर रहा हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मुझे कुछ महत्वपूर्ण याद नहीं आ रहा है।

+5

कानूनी प्रश्न, मैंने हमेशा इसे ध्यान में रखे * डिफ़ॉल्ट केंद्र * का उपयोग किया है। –

उत्तर

11

एप्पल प्रलेखन अस्पष्ट है, और यह सिर्फ इतना है कि आम तौर पर एक प्रोग्रामर एक नया बनाने के लिए की जरूरत नहीं होगी राज्यों:

प्रत्येक चल कोको कार्यक्रम एक डिफ़ॉल्ट अधिसूचना केंद्र है। आप आमतौर पर अपना खुद का निर्माण नहीं करते हैं। एक NSNotificationCenter ऑब्जेक्ट केवल एक प्रोग्राम के भीतर अधिसूचनाएं प्रदान कर सकता है।

पूर्ण स्रोत: NSNotificationCenter documentation

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

[center addObserver: self selector: @selector(observe:) name: @"observe" object: someObject]; 

और जब आप एक सूचना पोस्ट आप वस्तु निर्दिष्ट कर सकते हैं:

[center postNotificationName: @"observe" object: someObject]; 

इस तरह कहते हैं कि तुम एन नाम का उपयोग और एम ऑब्जेक्ट्स, आप एन * एम विशिष्ट अधिसूचनाओं को संभाल सकते हैं। मुझे लगता है कि दो अधिसूचना केंद्रों का उपयोग करने की आवश्यकता नहीं है। सैद्धांतिक रूप से यदि आपने सभी नामों को पूरा कर लिया है तो आप alloc + init का उपयोग करके एक और बना सकते हैं, लेकिन मुझे शायद ही यह दिखाई दे कि यह वास्तव में आसान कैसे हो सकता है।

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

इसके बजाय यदि आपने नोटिफिकेशन केंद्र आवंटित + init साथ मिल का उपयोग करें, तो आप यह सुनिश्चित करना चाहिए कि सभी संवाद स्थापित करने की वस्तुओं कि अधिसूचना केंद्र के लिए एक सूचक है, और यह कुछ जटिलता जोड़ना होगा। सभी अधिसूचना केंद्र की शक्ति बर्बाद हो जाएगी।

8

हालांकि यह defaultCenter सिंगलटन एक्सेसर के माध्यम से AppKit में भारी प्रयोग किया जाता है, यह के दिल में, NSNotificationCenter वास्तव में सिर्फ एक "सामान्य decoupling तंत्र है।" आपको alloc/init की अनुमति देने के आपके स्वयं के उदाहरण सिर्फ उस सामान्य-अभिव्यक्ति की अभिव्यक्ति है। यदि आप इसे किसी और चीज़ के लिए उपयोग करना चाहते थे, तो आप कर सकते थे।

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

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

जो कुछ भी कहा गया, मैंने स्वीकार किया कि, मेरे अनुभव में, NSNotificationCenter के निजी उदाहरण बनाना बहुत दुर्लभ है।

संबंधित मुद्दे