उद्देश्य-सी में कॉल बैक फ़ंक्शन कैसे करें?
मैं कुछ पूर्ण उदाहरण देखना चाहूंगा और मुझे इसे समझना चाहिए।
उद्देश्य-सी में कॉल बैक फ़ंक्शन कैसे करें?
मैं कुछ पूर्ण उदाहरण देखना चाहूंगा और मुझे इसे समझना चाहिए।
जवाबों:
आम तौर पर, उद्देश्य C में कॉलबैक प्रतिनिधियों के साथ किया जाता है। यहाँ एक कस्टम प्रतिनिधि कार्यान्वयन का एक उदाहरण है;
शीर्ष लेख फ़ाइल:
@interface MyClass : NSObject {
id delegate;
}
- (void)setDelegate:(id)delegate;
- (void)doSomething;
@end
@interface NSObject(MyDelegateMethods)
- (void)myClassWillDoSomething:(MyClass *)myClass;
- (void)myClassDidDoSomething:(MyClass *)myClass;
@end
कार्यान्वयन (.m) फ़ाइल
@implementation MyClass
- (void)setDelegate:(id)aDelegate {
delegate = aDelegate; /// Not retained
}
- (void)doSomething {
[delegate myClassWillDoSomething:self];
/* DO SOMETHING */
[delegate myClassDidDoSomething:self];
}
@end
यह सामान्य दृष्टिकोण को दर्शाता है। आप NSObject पर एक श्रेणी बनाते हैं जो आपके कॉलबैक विधियों के नामों की घोषणा करता है। NSObject वास्तव में इन विधियों को लागू नहीं करता है। इस प्रकार की श्रेणी को एक अनौपचारिक प्रोटोकॉल कहा जाता है, आप बस कह रहे हैं कि कई ऑब्जेक्ट इन विधियों को लागू कर सकते हैं। वे आगे चयनकर्ता के प्रकार के हस्ताक्षर की घोषणा करने का एक तरीका हैं।
आगे आपके पास कुछ ऑब्जेक्ट "MyClass" के प्रतिनिधि होंगे और MyClass प्रतिनिधि को प्रतिनिधि के तरीके को उपयुक्त बताते हैं। यदि आपके प्रतिनिधि कॉलबैक वैकल्पिक हैं, तो आप आम तौर पर उन्हें प्रेषण साइट पर कुछ इस तरह से रख सकते हैं, जैसे "अगर ([प्रतिनिधि का जवाब है। उत्तर: @selector (myClassWillDoSomething :)) {"। मेरे उदाहरण में, प्रतिनिधि को दोनों तरीकों को लागू करने की आवश्यकता है।
अनौपचारिक प्रोटोकॉल के बजाय, आप @protocol से परिभाषित एक औपचारिक प्रोटोकॉल का भी उपयोग कर सकते हैं। यदि आप ऐसा करते हैं, तो आप प्रतिनिधि सेटर के प्रकार को बदल देंगे, और चर को id <MyClassDelegate>
केवल " id
" के बजाय " " होने देंगे ।
इसके अलावा, आप देखेंगे कि प्रतिनिधि बरकरार नहीं है। यह आमतौर पर किया जाता है क्योंकि ऑब्जेक्ट जो "MyClass" के "मालिक" उदाहरण हैं, आमतौर पर भी प्रतिनिधि हैं। यदि MyClass ने अपने प्रतिनिधि को बनाए रखा, तो एक चक्र होगा। यह एक वर्ग के डीललोक पद्धति में एक अच्छा विचार है जिसमें एक MyClass उदाहरण है और इसके प्रतिनिधि को यह स्पष्ट करना है कि यह एक कमजोर बैक पॉइंटर होने के बाद से उस प्रतिनिधि को संदर्भित करता है। अन्यथा अगर कुछ MyClass उदाहरण को जीवित रख रहा है, तो आपके पास झूलने वाला सूचक होगा।
पूर्णता के लिए, चूंकि StackOverflow RSS ने केवल मेरे लिए प्रश्न को यादृच्छिक रूप से पुनर्जीवित किया है, अन्य (नया) विकल्प ब्लॉक का उपयोग करना है:
@interface MyClass: NSObject
{
void (^_completionHandler)(int someParameter);
}
- (void) doSomethingWithCompletionHandler:(void(^)(int))handler;
@end
@implementation MyClass
- (void) doSomethingWithCompletionHandler:(void(^)(int))handler
{
// NOTE: copying is very important if you'll call the callback asynchronously,
// even with garbage collection!
_completionHandler = [handler copy];
// Do stuff, possibly asynchronously...
int result = 5 + 3;
// Call completion handler.
_completionHandler(result);
// Clean up.
[_completionHandler release];
_completionHandler = nil;
}
@end
...
MyClass *foo = [[MyClass alloc] init];
int x = 2;
[foo doSomethingWithCompletionHandler:^(int result){
// Prints 10
NSLog(@"%i", x + result);
}];
यहाँ एक उदाहरण है जो प्रतिनिधियों की अवधारणाओं को बाहर रखता है, और बस एक कच्चा कॉल वापस करता है।
@interface Foo : NSObject {
}
- (void)doSomethingAndNotifyObject:(id)object withSelector:(SEL)selector;
@end
@interface Bar : NSObject {
}
@end
@implementation Foo
- (void)doSomethingAndNotifyObject:(id)object withSelector:(SEL)selector {
/* do lots of stuff */
[object performSelector:selector withObject:self];
}
@end
@implementation Bar
- (void)aMethod {
Foo *foo = [[[Foo alloc] init] autorelease];
[foo doSomethingAndNotifyObject:self withSelector:@selector(fooIsDone:)];
}
- (void)fooIsDone:(id)sender {
NSLog(@"Foo Is Done!");
}
@end
आमतौर पर विधि - [फू doSomethingAndNotifyObject: withSelector:] अतुल्यकालिक होगी जो कॉलबैक को यहां से अधिक उपयोगी बनाती है।
इस सवाल को अप-टू-डेट रखने के लिए, आईओएस 5.0 की एआरसी की शुरूआत का मतलब है कि इसे ब्लॉक का उपयोग करके और भी संक्षिप्त रूप से प्राप्त किया जा सकता है :
@interface Robot: NSObject
+ (void)sayHi:(void(^)(NSString *))callback;
@end
@implementation Robot
+ (void)sayHi:(void(^)(NSString *))callback {
// Return a message to the callback
callback(@"Hello to you too!");
}
@end
[Robot sayHi:^(NSString *reply){
NSLog(@"%@", reply);
}];
यदि आप कभी ऑब्जेक्टिव-सी के ब्लॉक सिंटैक्स को भूल जाते हैं, तो हमेशा ब्लॉक सिंटैक्स पर F **** होता है ।
+ (void)sayHi:(void(^)(NSString *reply))callback;
नहीं होना चाहिए+ (void)sayHi:(void(^)(NSString *))callback;
- (void)someMethodThatTakesABlock:(returnType (^nullability)(parameterTypes))blockName;
(नोट parameterTypes
नहीं parameters
)
CallBack: Objective C में 4 प्रकार के कॉलबैक हैं
चयनकर्ता प्रकार : आप NSTimer देख सकते हैं, UIPangesture चयनकर्ता कॉलबैक के उदाहरण हैं। कोड के बहुत सीमित निष्पादन के लिए उपयोग किया जाता है।
डेलिगेट प्रकार : सामान्य और Apple ढांचे में सबसे अधिक उपयोग किया जाता है। UITableViewDelegate, NSNURLConnectionDelegate। वे आमतौर पर सर्वर से अतुल्यकालिक रूप से कई छवियों को डाउनलोड करने के लिए उपयोग किए जाते हैं।
कृपया मुझे इसके लिए कोई अन्य उत्तर दें। मैं इसकी प्रशंसा करूंगा।