swift - स्विफ्ट में प्रतिनिधि के उदाहरण




design-patterns delegates (3)

प्रत्यायोजन क्या है?

सबसे पहले, आपको पता होना चाहिए कि डेलिगेशन पैटर्न iOS दुनिया के लिए अनन्य नहीं है:

सॉफ्टवेयर इंजीनियरिंग में, डेलिगेशन पैटर्न ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में एक डिज़ाइन पैटर्न है जो ऑब्जेक्ट रचना को विरासत के समान कोड पुनः उपयोग को प्राप्त करने की अनुमति देता है।

लेकिन आईओएस दुनिया में प्रतिनिधिमंडल के साथ काम करना बहुत आम है, मेरा मानना ​​है कि आप कई वर्गों को देख सकते हैं जो इस्तेमाल किए गए उदाहरण के लिए गुण या व्यवहार प्रदान करने की क्षमता देने के लिए एक प्रतिनिधिमंडल / डेटा स्रोत प्रदान करते हैं। यह कोकोआटच में वस्तुओं के एक दूसरे से बात करने के मुख्य तंत्रों में से एक है।

विकल्प:

हालांकि, प्रतिनिधिमंडल आईओएस में वस्तुओं को एक-दूसरे से बात करने का एकमात्र तरीका नहीं है, आप जानना चाह सकते हैं कि क्या हैं:

टिप्पणी : यदि आप उन दोनों के बीच तुलना करने में रुचि रखते हैं, तो आप निम्नलिखित लेखों को देखना चाहते हैं:

डेलिगेशन का उपयोग कब करें?

तो, सवाल यह है: "तो मुझे उन विकल्पों के बजाय प्रतिनिधिमंडल का उपयोग क्यों करना चाहिए?"

मैं इसे सरल बनाने की कोशिश करूंगा; मैं आपको दो वस्तुओं के बीच एक से एक संबंध होने पर प्रतिनिधिमंडल के उपयोग का सुझाव दूंगा। इसे स्पष्ट करने के लिए, NotificationCenter के बारे में थोड़ी सी बात करने का लक्ष्य यह है कि प्रतिनिधि के रूप में यह समझने की कोशिश करें:

NotificationCenter एक से कई संबंधों का प्रतिनिधित्व करता है ; बस, यह इस तरह से काम करता है: किसी विशेष घटना पर एक अधिसूचना पोस्ट करना (सूचित करना) और इस अधिसूचना के बारे में देखना (सूचित करना) - यह कहीं और भी देखा जा सकता है; तार्किक रूप से, यही एक रिश्ते के लिए बहुत मायने रखता है। यह ऑब्जर्वर पैटर्न का प्रतिनिधित्व है।

प्रत्यायोजन कैसे लागू करें?

सरलीकरण के उद्देश्य से, मैं इसका उल्लेख चरणों के रूप में करूंगा:

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

  2. प्रतिनिधिमंडल के लिए अनुरूपण: यह बस आपकी कक्षा को एक प्रतिनिधि बनाने की अनुमति देता है, इसे चिह्नित करके। उदाहरण के लिए: class ViewController: UIViewController, UITableViewDelegate {}

  3. डेलिगेट ऑब्जेक्ट को कनेक्ट करना: अपनी क्लास को एक डेलिगेट के रूप में चिह्नित करना पर्याप्त नहीं है, आपको यह सुनिश्चित करने की ज़रूरत है कि जिस ऑब्जेक्ट को आप अपनी क्लास से पक्का करना चाहते हैं, वह आपकी क्लास को ज़रूरी काम दे।

  4. आवश्यकताओं को लागू करना: अंत में, आपके वर्ग को प्रतिनिधि प्रोटोकॉल में सूचीबद्ध सभी आवश्यक विधियों को लागू करना होगा।

उदाहरण के लिए

क्या यह थोड़ा भ्रमित करने वाला लगता है? एक वास्तविक दुनिया उदाहरण के बारे में क्या?

इस परिदृश्य पर विचार करें:

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

अब तक बहुत अच्छा, ऑडियो प्लेयर दृश्य में इसकी अलग-अलग UIView क्लास और .xib फ़ाइल है; इसे किसी भी वांछित दृश्य नियंत्रक के रूप में एक उप के रूप में जोड़ा जाना चाहिए।

अब, आप प्रत्येक व्यू कॉन्ट्रोलर के लिए दोनों बटन की कार्यक्षमता को कैसे जोड़ सकते हैं? आप सोच सकते हैं: "बस, मैं व्यू क्लास में एक IBAction जोड़ दूंगा और वह यह है", पहली नज़र में, यह ठीक लग सकता है, लेकिन थोड़ा सोचने के बाद, आप महसूस करेंगे कि यह लागू नहीं होगा यदि आप नियंत्रक परत पर बटन दोहन की घटना को संभालने की कोशिश कर रहे हैं; यह स्पष्ट करने के लिए कि ऑडियो प्लेयर दृश्य में बटन टैप करने पर प्रत्येक व्यू कॉन्ट्रोलर ने अलग-अलग कार्यक्षमता को लागू किया तो क्या होगा? उदाहरण के लिए: "ए" व्यूकंट्रोलर में प्लेलिस्ट को टैप करने से एक टेबल व्यू प्रदर्शित होगा, लेकिन "बी" व्यूकंट्रोलर में इसे टैप करने पर एक पिकर प्रदर्शित होगा।

खैर, आइए इस मुद्दे पर प्रतिनिधिमंडल लागू करें:

"#" टिप्पणियां "आवेदन कैसे लागू करें?" के चरणों का प्रतिनिधित्व करती हैं। अनुभाग।

ऑडियो प्लेयर देखें:

// # 1: here is the protocol for creating the delegation
protocol AudioPlayerDelegate: class {
    func playPauseDidTap()
    func playlistDidTap()
}

class AudioPlayerView: UIView {
    //MARK:- IBOutlets
    @IBOutlet weak private var btnPlayPause: UIButton!
    @IBOutlet weak private var btnPlaylist: UIButton!

    // MARK:- Delegate
    weak var delegate: AudioPlayerDelegate?

    // IBActions
    @IBAction private func playPauseTapped(_ sender: AnyObject) {
        delegate?.playPauseDidTap()
    }

    @IBAction private func playlistTapped(_ sender: AnyObject) {
        delegate?.playlistDidTap()
    }
}

नियंत्रक देखें:

class ViewController: UIViewController {
    var audioPlayer: AudioPlayerView?

    // MARK:- Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        audioPlayer = AudioPlayerView()
        // # 3: the "AudioPlayerView" instance delegate will implemented by my class "ViewController"
        audioPlayer?.delegate = self
    }
}

// # 2: "ViewController" will implement "AudioPlayerDelegate":
extension ViewController: AudioPlayerDelegate {
    // # 4: "ViewController" implements "AudioPlayerDelegate" requirments:
    func playPauseDidTap() {
        print("play/pause tapped!!")
    }

    func playlistDidTap() {
        // note that is should do a different behavior in each viewController...
        print("list tapped!!")
    }
}


जल्द सलाह:

प्रतिनिधि नियंत्रकों का उपयोग करने के सबसे लोकप्रिय उदाहरणों में से एक है देखें कंट्रोलर्स के बीच डेटा बैकिंग।

मैं सीखने की कोशिश कर रहा हूं कि प्रोटोकॉल के साथ प्रतिनिधिमंडल कैसे काम करता है। मुझे सब कुछ समझ में आया, लेकिन मैं यह नहीं सोच सकता कि टेबल व्यू और संभवतः स्क्रॉल व्यू का उपयोग करते समय प्रतिनिधिमंडल का उपयोग कब करना चाहिए।

सामान्य तौर पर, प्रतिनिधिमंडल का उपयोग कब किया जाता है?


IOS दुनिया में और ज्यादातर MVC (मॉडल व्यू कंट्रोलर) में प्रतिनिधिमंडल व्यूअर के लिए कंट्रोलर से बात करने का एक तरीका है और इसे "ब्लाइंड कम्युनिकेशन" कहा जाता है और प्रतिनिधिमंडल का मतलब किसी अन्य ऑब्जेक्ट को "लीडिंग स्टिक" देना है (वास्तव में परवाह नहीं है) जो नियंत्रण में है, लेकिन आमतौर पर नियंत्रक) को उन घटकों पर नियंत्रण करने के लिए जो दृश्य को स्वयं पर नियंत्रित नहीं कर सकते हैं (याद रखें कि यह केवल एक दृश्य है) या इसे और अधिक सरल बनाने के लिए स्वयं नहीं है ...।
नियंत्रक एक दृश्य से बात कर सकता है लेकिन दृश्य प्रतिनिधि के बिना नियंत्रक से बात नहीं कर सकता है


प्रत्यायोजन का उपयोग तब किया जाता है जब आप किसी वस्तु या वस्तु की स्थिति को किसी अन्य वस्तु बी में भेजना चाहते हैं। आमतौर पर ऑब्जेक्ट बी वह वस्तु है जो ऑब्जेक्ट ए बनाता है।

मैं कुछ स्थितियों को सूचीबद्ध करूँगा जहाँ आप प्रतिनिधिमंडल का उपयोग करेंगे।

  1. हाँ तुम सही हो। तालिका दृश्य और स्क्रॉल दृश्य प्रतिनिधि का उपयोग करते हैं क्योंकि वे यह बताना चाहते हैं कि जो कोई भी इच्छुक है (आपके विचार नियंत्रक को बताएं) कि "किसी ने एक पंक्ति का चयन किया है!" या "किसी ने स्क्रॉल दृश्य स्क्रॉल किया है!"। न केवल स्क्रॉल विचार और तालिका दृश्य प्रतिनिधि, UITextField और UIDatePicker और बहुत सारे अन्य विचार प्रतिनिधि भी उपयोग करते हैं!

  2. देखें नियंत्रकों में भी प्रतिनिधि होते हैं। उदाहरण के लिए, UIImagePickerController । इसका कारण लगभग ऊपर जैसा ही है - क्योंकि UIImagePickerController आपको "संदेश का चयन किया गया है" जैसे संदेश बताना चाहता है। एक और उदाहरण UIPopoverControllerDelegate होगा। यह प्रतिनिधि आपको "पॉपओवर को खारिज कर दिया गया" जैसी चीजें बताता है!

  3. प्रतिनिधि का उपयोग करने वाले अन्य वर्गों में CLLocationManager शामिल हैं। यह प्रतिनिधि आपको "उपयोगकर्ता के स्थान का पता लगाया गया है" या "उपयोगकर्ता के स्थान का पता लगाने में विफल" जैसी चीजें बताता है।

  4. आप अपने कोड में प्रतिनिधिमंडल का उपयोग कर सकते हैं जब आप का एक निश्चित दृश्य नियंत्रक अन्य दृश्य नियंत्रकों को संदेश भेजना चाहता है। यदि यह एक सेटिंग व्यू कंट्रोलर है, तो यह "फॉन्ट साइज़ सेटिंग को बदल दिया गया है" जैसे संदेश भेज सकता है! और व्यू कंट्रोलर जो कि फॉन्ट साइज़ सेटिंग को बदलने के बारे में ध्यान रखता है, लेबल या किसी चीज़ के फॉन्ट साइज़ को जान और बदल देगा।







delegation