2011-11-24 3 views
5

में प्रतिनिधि बनाम घटनाएं मैं अपना पहला आईफोन ऐप लिख रहा हूं, और मैं कोको टच एंड ऑब्जेक्टिव-सी में डिज़ाइन पैटर्न की खोज कर रहा हूं। मैं क्लाइंट-साइड वेब विकास की पृष्ठभूमि से आया हूं, इसलिए मैं अपने सिर को प्रतिनिधियों के चारों ओर लपेटने की कोशिश कर रहा हूं।कोको टच

विशेष रूप से, मुझे नहीं लगता कि ईवेंट हैंडलर के बजाय प्रतिनिधि वस्तुओं की आवश्यकता क्यों है। उदाहरण के लिए, जब उपयोगकर्ता एक बटन दबाता है, तो इसे किसी ईवेंट (UITouchUpInside) से संभाला जाता है, लेकिन जब उपयोगकर्ता टेक्स्ट बॉक्स में इनपुट करने को समाप्त करता है और उसे 'संपन्न' बटन से बंद कर देता है, तो कार्रवाई को विधि पर कॉल करके संभाला जाता है टेक्स्ट बॉक्स का प्रतिनिधि (textFieldShouldReturn)।

किसी ईवेंट के बजाय प्रतिनिधि विधि का उपयोग क्यों करें? मैं इसे viewDidLoad विधि के साथ व्यू कंट्रोलर में भी देखता हूं। घटनाओं का उपयोग क्यों न करें?

उत्तर

6

संपादित करें: एक और अच्छा पोस्ट: 1 संबंध: NSNotificationCenter vs delegation(using protocols)?

एक प्रतिनिधि एक कॉलबैक तो वहाँ एक 1 है। प्रतिनिधि एक ऑब्जेक्ट का एक उदाहरण है जो एक औपचारिक प्रोटोकॉल लागू करता है।

अधिसूचनाएं (घटनाएं) मूल रूप से कई वस्तुओं को प्रसारित करती हैं जो कुछ होने पर रुचि रखते हैं।

प्रतिनिधियों विचारों के बीच संवाद स्थापित करने से पहले के रूप में और कॉलबैक के बाद इस तरह के प्रसंस्करण के कुछ अन्य वस्तुओं की पाइप लाइन में कोड interject करने में सक्षम होने, एक नियंत्रण के डेटा स्रोत प्रदान करने और के लिए अच्छे हैं:

What exactly does delegate do in xcode ios project?

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

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

4

एक स्पष्ट भेद यह है कि प्रतिनिधियों के तरीकों में वापसी मूल्य हो सकते हैं क्योंकि एक-से-एक संबंध है। दूसरी तरफ घटनाएं भेजने वाले वर्ग के साथ मिलती-जुलती होती हैं, जो आमतौर पर कुछ भी प्रतिक्रिया नहीं देती है या नहीं।

अन्य प्रतिनिधि विधियां सुविधा के लिए बस वहां हैं और इसी तरह की घटनाएं भी हो सकती हैं जो ट्रिगर भी हो सकती हैं।

5

घटनाक्रम और प्रतिनिधियों के दो अलग-अलग उद्देश्य हैं, इसलिए आप दोनों का उपयोग देखेंगे।

यदि आप चाहते हैं कि आपका बटन किसी संदेश को बंद करने के लिए दबाए, तो कोई ईवेंट ठीक है। यदि आप चाहते हैं कि हो गया बटन फ़ील्ड के संदर्भ को फोकस करने से पहले टेक्स्ट फ़ील्ड के संदर्भ को सत्यापित करने के लिए दबाएं, तो आप textFieldShouldReturn किसी भी सत्यापन को संभालने के लिए प्रतिनिधि विधि का उपयोग कर सकते हैं और यदि यह मान्य नहीं है तो वापस लौटाएं।

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

यदि आप खुद को यह सोचते हैं कि आपको UIKit ऑब्जेक्ट को उप-वर्गीकृत करने की आवश्यकता है, तो पहले इसके प्रतिनिधि तरीकों की जांच करें। संभावना है कि आपके कस्टम व्यवहार को रखने के लिए पहले से ही एक जगह है।

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

  • कोई संबंधित समस्या नहीं^_^