2009-12-18 9 views

उत्तर

94

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

यदि आपके द्वारा छोड़ा जाने वाला ईवेंट कई ऑब्जेक्ट्स में रुचि के हो सकता है (उदा। स्क्रीन घुमावदार, स्मृति उपयोग, उपयोगकर्ता लॉगिन/लॉगआउट), तो आपको NSNotificationCenter का उपयोग करना चाहिए।

+25

मैं यह भी जोड़ूंगा कि अधिसूचनाएं एक तरफा हैं (उदा।, 'DidFireMissle'), जबकि यदि आपको जानकारी वापस करने की आवश्यकता है तो एक प्रतिनिधि की आवश्यकता होती है (उदा।,' - (BOOL) mustFireMissle')। – benzado

+7

@ बेंजाडो: असल में, आप किसी ऑब्जेक्ट को एक संदेश के साथ पास कर सकते हैं, जो रिसीवर बदल सकता है। आपको यह ध्यान रखना होगा कि एकाधिक (या शून्य) रिसीवर अधिसूचना को संभाल सकते हैं, लेकिन यह मान्य है। –

34

उनके उद्देश्यों के अलग हैं:

  • सूचना संदेश भेजने वाले से करने के लिए संभवतः कई प्राप्तकर्ताओं अज्ञात प्रसारित करने के लिए प्रयोग किया जाता है।

  • प्रतिनिधिमंडल को प्रेषक की ओर से कार्यरत एक ज्ञात प्राप्तकर्ता को संदेश भेजने के लिए उपयोग किया जाता है।

7

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

एक प्रतिनिधि के बजाय प्रतिनिधियों की एक श्रृंखला रखने से रोकने के लिए कुछ भी नहीं है।

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

और आखिरकार, मानक API से अधिसूचनाओं के साथ आपके पास विकल्प नहीं है और किसी भी घटना के लिए ऐप्पल को दो तरीकों से उपयोग करने के लिए उपयोग करना चाहिए।

11

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

3

उन दोनों के बीच एक विकल्प पर्यवेक्षक पैटर्न का उपयोग कर रहा है, NSNotificationCenter के बिना। मेरे उद्देश्य-सी कार्यान्वयन को देखें here

6

नोटिफिकेशन UI घटकों को डीकॉप्लिंग करने के लिए बेहतर हैं। यह आपको अपने नियंत्रकों या मॉडलों में किसी भी संशोधन के बिना किसी भी दृश्य को प्लग करने की अनुमति देता है। कमजोर-युग्मित डिजाइन के लिए निश्चित रूप से बेहतर है।

लेकिन प्रतिनिधिमंडल और अधिसूचना के बीच प्रदर्शन के लिए, आपको कॉल की आवृत्ति के बारे में सोचना होगा।

प्रतिनिधि अक्सर अधिक घटनाओं के लिए बेहतर हो सकता है, सूचनाएं कम लगातार घटनाओं के लिए बेहतर होती हैं लेकिन अधिक प्राप्तकर्ता। यह प्रोजेक्ट पर निर्भर है कि क्या चुनना है।

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