डेलिगेशन क्या है और आईओएस प्रोग्रामिंग में क्यों महत्वपूर्ण है?


11

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


4
आपको स्टैक ओवरफ्लो उपयोगी पर ऑब्जेक्टिव c + डेलिगेट्स टैग चौराहा मिल सकता है ।

जवाबों:


16

समझने के delegatesलिए समझना होगा protocols

A protocolसेवा अनुबंध की तरह है। जब कोई वस्तु (सबसे अधिक बार एक UIViewControllerउपवर्ग, लेकिन हमेशा नहीं) उस अनुबंध पर हस्ताक्षर करती है, तो यह कह रही है कि "मुझे आपके द्वारा भेजे गए संदेश को वापस करने के लिए तर्क प्रदान करने में दिलचस्पी है"। यह NSNotificationCenterब्याज के एक स्तर के लिए साइन अप करने के संबंध में समान है , अंतर जो एक प्रतिनिधि के रूप में कार्यरत है, वह केवल delegateएक समय में एक हो सकता है, जहां कई ऑब्जेक्ट समान के लिए साइन अप कर सकते हैं NSNotification

Apple प्रतिनिधिमंडल का व्यापक रूप से उपयोग करता है। अधिक से अधिक, हालांकि, आप देख रहे हैं कि Apple अपने API को बहुत अधिक स्थानांतरित कर रहा है blocks, जो callbacksअन्य भाषाओं में समान हैं।

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

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

तो, एक ओर, प्रतिनिधिमंडल किसी वस्तु से बातचीत के लिए डेटा की आपूर्ति और प्रतिक्रिया देने के लिए महान है। आप UIKit कक्षाएं, इस तरह के एक का एक बहुत में यह देखेंगे UITableView, UIPickerView, UICollectionView, आदि

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

@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end

@interface MyChildViewController : UIViewController

@property (weak, nonatomic) id <MyChildDelegate> delegate;

@end

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

- (IBAction)someButtonTapped:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
        [self.delegate buttonWasTappedInChild:self];
    }
}

फिर अपने पैरेंट व्यू कंट्रोलर में अपने MyChildViewController के प्रतिनिधि को सेट करें selfऔर लागू - (void)buttonWasTappedInChild:(MyChildViewController *)childViewControllerकरें। बूम! आपके पास बच्चे से लेकर माता-पिता तक की जानकारी है। दो वस्तुओं के बीच संबंध को माता-पिता / बच्चे के समान होने की आवश्यकता नहीं है। यह एक सेवा अनुबंध है, इसलिए जब तक हस्ताक्षर करने वाली वस्तु आवश्यक तरीकों को लागू करके सौदेबाजी के अपने अंत को बनाए रखती है, तब तक आप सुनहरे हैं!

नोट: प्रतिनिधि कमजोर / संपत्तियों को निर्दिष्ट करने वाले होने चाहिए, अन्यथा आप एक अनुरक्षण चक्र में प्रवेश करेंगे जहां न तो वस्तु को निपटाया जा सकता है।

उम्मीद है की यह मदद करेगा!


2

प्रतिनिधि वे वस्तुएं हैं जो कुछ कार्यों को कार्यान्वित करती हैं, जब उन कार्यों को सामान्य वस्तु पर लागू करने का कोई मतलब नहीं होता है। यह निर्भरता इंजेक्शन का एक रूप है।

एक ठोस उदाहरण के लिए, UITableViewDelegate प्रोटोकॉल देखें। ये तरीके सीधे लागू करने के लिए टेबल व्यू के लिए कोई मतलब नहीं रखते हैं, क्योंकि टेबल व्यू रो का चयन करने की कार्रवाई प्रत्येक ऐप और प्रत्येक टेबल व्यू में अलग-अलग होगी। प्रतिनिधि के पास एक तरीका है -tableView:didSelectRowAtIndexPath:जिससे आप एक ऐसी वस्तु बना सकते हैं जो कि आपके द्वारा लागू की जाने वाली प्रत्येक अलग कार्रवाई के लिए तालिका दृश्य को उप-वर्ग किए बिना पंक्ति चयन को संभालती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.