2011-01-03 14 views
24

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

उत्तर

9

दिलचस्प विचार - जब आप कॉलबैक विधि के स्थान पर ब्लॉक/बंद करने का उपयोग कर सकते हैं, तो मुझे नहीं लगता कि प्रतिनिधिमंडल को बदलने के लिए इसका कभी भी उपयोग कैसे किया जा सकता है - सभी प्रतिनिधिमंडल लगभग ऑब्जेक्ट का साधन हैं ऑब्जेक्ट संचार और इसलिए संभावनाएं कोड के मनमानी टुकड़े को निष्पादित करने से कहीं अधिक समृद्ध हैं।

इस तरह, मुझे आपके "एकल कार्यों के लिए अधिक उपयुक्त" टिप्पणी (और फिर भी केवल कुछ अलग कार्य) से सहमत होना होगा।

40

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

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

संपादित करें: हां, तो कुछ उदाहरण:

UIScrollViewDelegate सही ढंग से एक प्रतिनिधि के प्रोटोकॉल है, क्योंकि (i) वहाँ बातें संप्रेषित किया जा करना पड़ सकता है कि की एक विस्तृत श्रृंखला है, (ii) उन्हें किसी भी क्रम में और किसी भी समय संवाद करने की आवश्यकता हो सकती है; और (iii) प्रतिनिधिमंडल के नियंत्रण से परे कारणों के लिए उन्हें सूचित किया जाएगा।

NSURLConnection +sendAsynchronousRequest:queue:completionHandler: सही परिणाम देने के लिए एक ब्लॉक लेता है क्योंकि (i) रिपोर्ट करने के लिए बिल्कुल एक परिणाम है; और (ii) रिपोर्ट कॉलर द्वारा की गई कार्रवाई के प्रत्यक्ष परिणाम के रूप में वापस आती है।

+0

कृपया कुछ और उदाहरण दें जो कि महान होंगे। धन्यवाद – Sandy

+0

मुझे संचार पर नहीं मिला? – Sandy

+8

@ सैंडी मैं वकालत कर रहा हूं कि ब्लॉक विशिष्ट कार्यों के परिणाम देने के लिए एक अच्छा तरीका है लेकिन अधिक सामान्य बातचीत के लिए एक खराब नींव है। एक ब्लॉक प्रदान करना श्रोता की तरह है 'यह है कि आप मुझसे कैसे बात करते हैं'; एक प्रतिनिधि प्रोटोकॉल टॉकर की तरह है 'यह है कि मैं आपसे कैसे बात करूंगा'। यदि वार्ताकार मुख्य रूप से निर्णय लेने का फैसला करता है तो उसे यह निर्देश देना चाहिए कि यह कैसे बात करता है। अगर श्रोता सिर्फ पूछता है कि एक विशिष्ट चीज हो जाती है और परिणाम वापस रिपोर्ट किए जाते हैं तो यह समझ में आता है कि यह कहता है '... और इस तरह की रिपोर्ट करें'। – Tommy

8

मैं यह तय करने का प्रयास कर रहा था कि मुझे अन्य उत्तरों पर कोई टिप्पणी छोड़नी चाहिए या अपना जवाब छोड़ देना चाहिए। मैंने फैसला किया और यह यहाँ है।

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

मुझे लगता है कि यह एक पर्यवेक्षक पैटर्न बनाम प्रतिनिधिमंडल पैटर्न कार्यान्वयन विस्तार है जिसे मैं विशेष रूप से दृढ़ता से महसूस नहीं करता हूं। मैं विरासत उन्मुख पर बहुत अधिक रचना कर रहा हूं इसलिए मैं सी # में भी प्रतिनिधिमंडल पैटर्न का उपयोग करता हूं।

मुझे नहीं लगता कि किसी को भी दूसरे को प्रतिस्थापित करना चाहिए। मुझे लगता है कि दो पैटर्न का उपयोग किया जाना चाहिए जहां प्रत्येक सबसे उपयुक्त है; हालांकि, मुझे कई उदाहरण मिले हैं जहां मैं कोको में प्रतिनिधिमंडल पैटर्न पर पर्यवेक्षक पैटर्न को निश्चित रूप से पसंद करूंगा।

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

हाल ही में, मैंने गेमकिट को अपने खेलों में से एक में एकीकृत किया और पाया कि अधिकांश असीमित कॉल (वास्तव में, मैंने जो भी उपयोग किया है) प्रतिनिधि का उपयोग नहीं करते हैं; वे ब्लॉक का उपयोग करते हैं। मुझे लगता है कि अगर वे आज UIAlertView को फिर से लिख सकते हैं, तो वे उपयोगकर्ता इनपुट के बाद कॉलबैक को संभालने के लिए प्रतिनिधियों के बजाय ब्लॉक का उपयोग करेंगे। बेशक, यह सिर्फ अटकलें है।

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

+0

ग्रेट संक्षिप्त उत्तर। – poiuytrez

+0

वास्तव में, आईओएस 8 में, यूआईएलर्टव्यू व्यू कंट्रोलर द्वारा बदला गया था। और UIAlertViewController में ऐसे क्रियाएं हैं जो ब्लॉक का उपयोग करती हैं। – dcorbatta

1

मैं इस विषय पर अपना स्वयं का शोध कर रहा हूं और मुझे यह आलेख जस्टिन ड्रिस्कॉल द्वारा लिखित बहुत ही निर्देशक पाया गया है, और मुझे उम्मीद है कि यह किसी और की भी मदद कर सकता है।

यहाँ लिंक है: Communicating with Blocks in Objective-C

0

प्रतिनिधियों - जब आप प्रक्रिया/घटनाक्रम/राज्य जानना चाहता हूँ तुम प्रतिनिधि उपयोग कर सकते हैं। उदाहरण NSURLConnectionDelegate में के लिए आप दो या अधिक प्रतिनिधि के तरीकों के साथ डेटा की स्थिति मिल जाएगा .didReceive: NSData connectionDidFinishLoading

ब्लाकों - आप ब्लॉक केवल उपयोग कर सकते हैं जब आप एक परिणाम या त्रुटि उम्मीद

बेस्ट संदर्भ - http://blog.stablekernel.com/blocks-or-delegates/

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