2012-01-28 15 views
10

मैं केवल आईओएस विकास शुरू कर रहा हूं लेकिन सी # के माध्यम से एएसपीनेट के कुछ साल देव हैं। ईमानदार होने के लिए मुझे पहले प्रतिनिधियों/घटनाओं आदि को समझने की वास्तविक आवश्यकता नहीं थी, मुझे पता है कि मैं वेब.फॉर्म प्रोग्रामिंग करते समय उनका उपयोग कर रहा हूं लेकिन कई कार्यक्षमताओं को ढांचे के पीछे, ढांचे के पीछे ख्याल रखा जाता है ।आईओएस में प्रतिनिधियों - कुछ स्पष्टीकरण की आवश्यकता

तो अब मैं आईओएस में विकास कर रहा हूं, मुझे यह समझने की कोशिश करने के लिए मजबूर होना पड़ता है कि वे कैसे काम करते हैं (मैं यहां मान रहा हूं कि प्रतिनिधियों/घटनाओं का सिद्धांत भाषाओं में समान है, शायद मैं गलत हूं)। वैसे भी, आईओएस में कोड की निम्न पंक्ति:

if ([self.delegate respondsToSelector:@selector(startImporting:)]) 
{ 
      [self.delegate startImporting:self]; 
} 

मैं सही है कि सोच, छद्म कोड में में हूँ, यह की तर्ज पर कुछ अर्थ है:

विधि/वर्ग इस विधि बुला एक है इसे 'स्टार्ट इंपोर्टिंग' कहा जाता है, फिर कॉलिंग क्लास के भीतर विधि 'स्टार्ट आयात करना' कॉल करें।

आशा है कि यह स्पष्ट है। अगर ऐसी बात है तो यह अनिवार्य रूप से सी # में एक स्थिर विधि है कि आप की तरह कुछ के साथ कह सकते हैं होने के रूप में ही होगा:

myImportClass.startImporting(); 

मुमकिन नहीं है, या कि यह कैसे किया जा जाएगा। तो, क्या मैं प्रतिनिधियों के पूरे बिंदु, उनके लाभ इत्यादि खो रहा हूं? मैंने पढ़ा है कि वे क्या खत्म कर रहे हैं और जब यह समझ में आता है, यह कभी क्लिक नहीं करता है, मैं कभी भी (वेब ​​रूपों में वैसे भी) वास्तव में उन्हें उपयोग करने का लाभ नहीं देखा है।

यह तेजी से महत्वपूर्ण हो जाता है क्योंकि मैं .net में लैम्ब्डा अभिव्यक्तियों का उपयोग करने के लिए आगे बढ़ रहा हूं और वे सी # में प्रतिनिधियों से निकटता से जुड़े हुए हैं, जबकि मैं बस उनका उपयोग शुरू कर सकता हूं, मैं जानना चाहूंगा कि क्यों और क्या लाभ प्रतिनिधि वास्तव में हैं।

+0

यहाँ http://stackoverflow.com/questions/30662032/ios-callback-function के रूप में यह गूगल चाहते हैं पुस्तकालय से आप प्रतिनिधियों के लिए कार्यान्वयन विवरण पा सकते हैं। –

उत्तर

45

में मदद करता है कोको में प्रतिनिधिमंडल पैटर्न सूचित करने के लिए प्रयोग किया जाता है:

हेरा stackOverflow में कुछ उपयोगी लिंक कर रहे हैं ।) या क्वेरी (क्रेडेंशियल के लिए पूछें, इत्यादि) इसके बारे में ज्यादा जानने के बिना एक और वस्तु।

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

एक उदाहरण

:
आप एक वर्ग है कि कुछ का उत्पादन किया है, चलो यह Machine और वर्ग Worker के एक कार्यकर्ता फोन करते हैं।

[machine produceStuff]; 

ठीक है, हमारा काम हो: हम Stuff उनमें काफी उत्पादन करना चाहते हैं

Machine *machine = [[Machine alloc] init]; 
[machine prepareWithParameters:myParameters]; 

अब मशीन है कि हम: मशीन कार्य के लिए समायोजित करने की आवश्यकता। लेकिन हम कैसे जानते हैं कि Stuff की एक इकाई का उत्पादन कब किया गया है? हम अपने मशीन के बगल में खड़े लगातार हमारे कार्यकर्ता है और इंतजार कर सकते हैं:

while (![machine isFinished]) { 
    if ([machine didProduceStuff]) { 
     Stuff *stuff = [machine producedStuff]; 
     [self doSomethingWithStuff:stuff]; 
    } 
    else { 
     // Get a very large coffee... 
    } 
} 

यह बहुत अच्छा नहीं होगा अगर मशीन, स्वचालित रूप से हमें सूचित किया था जब यह Stuff का एक इकाई के उत्पादन के साथ किया है?

Worker *worker; 
Machine *machine = [[Machine alloc] init]; 
[machine prepareWithParameters:myParameters]; 
[machine setDelegate:worker]; // worker does conform to <MachineDelegate> 

[machine produceStuff]; 

जब Machine कुछ का निर्माण किया जाता है, यह तो कहते हैं:

if ([[self delegate] respondsToSelector:@selector(machine:didProduceStuff:)]) 
    [[self delegate] machine:self didProduceStuff:stuff]; 

worker तो इस विधि प्राप्त होगा

@protocol MachineDelegate <NSObject> 
@optional 
    - (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff; 
@end 

के machine के एक प्रतिनिधि के रूप worker जोड़ें और कुछ कर सकते हैं:

- (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff { 
    [self doSomethingWithStuff:stuff]; 
    if ([machine isFinished]) 
     [self shutDownMachine:machine]; 

}

कि बहुत अधिक कुशल और कार्यकर्ता के लिए आसान नहीं है? अब मशीन मशीन के अलावा खड़े होने से कुछ और उत्पादक कर सकती है जबकि मशीन अभी भी उत्पादन कर रही है। अब आप MachineDelegate लिए और भी अधिक तरीकों जोड़ सकते हैं:

@protocol MachineDelegate <NSObject> 
@required 
    - (void) machineNeedsMaintenance:(Machine *)machine; 
    - (void) machine:(Machine *)machine fatalErrorOccured:(Error *)error; 
    - (BOOL) machine:(Machine *)machine shouldContinueAfterProductionError:(Error *)error; 
@optional 
    - (void) machineDidEnterEcoMode:(Machine *)machine; 
    - (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff; 
@end 

प्रतिनिधि भी यह उपवर्गीकरण बिना एक वस्तु का व्यवहार बदलने के लिए इस्तेमाल किया जा सकता:

@protocol MachineDelegate <NSObject> 
@required 
    - (Color *) colorForStuffBeingProducedInMachine:(Machine *)machine; 
    - (BOOL) machineShouldGiftWrapStuffWhenDone:(Machine *)machine; 
@end 

मुझे आशा है कि मैं मदद कर सकता है आप के लाभ को समझते हैं प्रतिनिधियों का उपयोग करके अपने कोड को थोड़ा सा सारणीबद्ध करना।

+2

आश्चर्यजनक रूप से व्यापक उत्तर। धन्यवाद! –

+2

बढ़िया! इस उत्तर को पढ़ने के बाद प्रतिनिधियों को समझना शुरू किया :) –

+0

यह अब तक का सबसे अच्छा उद्देश्य-सी प्रतिनिधि उदाहरण है –

1

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

आशा है कि यह

0

प्रतिनिधियों अन्य वर्ग

से कॉलबैक रही तो क्यों प्रतिनिधि का उपयोग करने में उपयोगी होते हैं: यह है कि हम एक वर्ग पर एक विधि कॉल ... कि सामान्य है ... अगर हम चाहते हैं हमें बताने के लिए instantiated वर्ग वापस बुलाने के ... कि जहां प्रतिनिधियों काम में आता है ...

सरल उदाहरण

: यू एक वर्ग पर एक साइट के लिए एक विधि का उपयोग करने से डाउनलोड गीत एक बार वर्ग को डाउनलोड यू वर्ग चाहता हूँ यू यह बताने के लिए पूरा करता है ..

//protocol declaration 
    @protocol DownloadProtocol <NSObject> 
    -(void)OnFinish; 
    @end 

//SOng download class 
@interface songs 
@property(Strong,nonatomic) id<DownloadProtcol> delegate; 
-(void)Download; 
@end 
@implementation songs 
-(void)Download 
{ 

///the code to download goes here 

[self callTheCallingClass]; 

} 

-(void)CallTheCallingClass 
{ 
[self.delegate OnFinish]; 
} 
@end 

// 
@interface mainclass<DownloadProtocol> 

@end 

@implementation mainclass 

-(void)viewDidload 
{ 
Songs *s=[[SOngs alloc]init]; 
s.delegate=self; 
[s download]; 
} 
-(void)OnFinish 
{ 
    NSlog(@"Called"); 
} 
@end 

1) को देखने के प्रतिनिधिमंडल उद्देश्य सी मुझे लगता है कि यू यह वाक्य रचना को समझ सकता हूँ में प्रोटोकॉल के माध्यम से हासिल की है ...

2) गीत श्रेणी में हम चाहते हैं कि प्रोटोकॉल के लिए एक संपत्ति बनाने के हम इसे प्रकार रखना आईडी के रूप में ... bcuz प्रकार संकलन समय पर ज्ञात नहीं है।

3) गीत डाउनलोड करने के बाद हम डाउनलोड को पूरा करते हैं, हम प्रोटोकॉल विधि को कॉल करते हैं ...

4) मुख्य वर्ग में पहले हम प्रोटोकॉल वाक्य रचना वर्ग अपनाने ऊपर है कि

5 की वाक्य रचना) हम गीत वर्ग का दृष्टांत है

6) फिर मुख्य वर्ग वस्तु आवंटित (स्वयं) गीत वर्ग के प्रतिनिधि के लिए

7) तो हम प्रोटोकॉल से विधि का नाम जोड़कर मीटर में प्रोटोकॉल वर्ग आवेदन करना होगा

8) तो अब से जब भी गीत वर्ग प्रतिनिधि उदाहरण चर के माध्यम से प्रोटोकॉल विधि कॉल पर .... मुख्य वर्ग पर बाहर protocl विधि गोद लेने चलाने हो जाता है

आशा है कि यह मदद करता है इस कोड की कोशिश ...

यदि u इस विषय पर अधिक जानकारी के प्रतिनिधि डिज़ाइन पैटर्न

मुख्य लाभ यह शिथिल प्रोग्रामिंग युग्मित को बढ़ावा देता है ...

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