如何在Objective-C中执行callback
如何在Objective-C中执行callback函数?
我只想看一些完整的例子,我应该理解它。
通常情况下,目标C的callback是由代表完成的。 这是一个自定义委托实现的例子。
/// Header File @interface MyClass : NSObject { id delegate; } - (void)setDelegate:(id)delegate; - (void)doSomething; @end @interface NSObject(MyDelegateMethods) - (void)myClassWillDoSomething:(MyClass *)myClass; - (void)myClassDidDoSomething:(MyClass *)myClass; @end /// Message (.m) File @implementation MyClass - (void)setDelegate:(id)aDelegate { delegate = aDelegate; /// Not retained } - (void)doSomething { [delegate myClassWillDoSomething:self]; /* DO SOMETHING */ [delegate myClassDidDoSomething:self]; } @end
这说明了一般的方法。 您在NSObject上创build一个类别,声明您的callback方法的名称。 NSObject实际上并没有实现这些方法。 这种types称为非正式协议,你只是说许多对象可能会实现这些方法。 他们是一种转发方式来声明select器的types签名。
接下来,您有一些对象是“MyClass”的委托,MyClass根据需要调用委托上的委托方法。 如果您的委托callback是可选的,那么您通常会在派遣站点中使用类似“if([delegate respondsToSelector:@selector(myClassWillDoSomething :)){”)的方式来保护它们。 在我的例子中,委托需要实现这两种方法。
而不是一个非正式的协议,你也可以使用@protocol定义的正式协议。 如果你这样做,你可以改变id <MyClassDelegate>
setter的types,实例variables是“ id <MyClassDelegate>
”而不是“ id
”。
另外,你会注意到代理不被保留。 这通常是因为“拥有”“MyClass”实例的对象通常也是委托。 如果MyClass保留它的委托,那么将会有一个保留周期。 在具有MyClass实例的类的dealloc方法中,这是一个好主意,并且是它的委托来清除该委托引用,因为它是一个弱返回指针。 否则,如果某些事情是保持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); }];
下面是一个例子,它保留了代表的概念,只是做一个原始的callback。
@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
通常,方法 – [Foo doSomethingAndNotifyObject:withSelector:]将是asynchronous的,这将使得callback比这里更有用。
为了让这个问题保持最新,iOS5.0引入了ARC,这意味着可以使用更简洁的块来实现:
@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); }];
如果你忘记了Objective-C的Block语法,总会有F **** ng Block Syntax 。
CallBack:目标C中有四种types的callback
-
select器types :您可以看到NSTimer,UIPangesture是Selectorcallback的示例。 用于非常有限的代码执行。
-
委托types :常用和最常用的Apple框架。 UITableViewDelegate,NSNURLConnectionDelegate。 它们通常用于显示从服务器asynchronous下载多个图像等
- NSNotifications :NotificationCenter是Objective C的一个特性,用于在事件发生时通知多个接收者。
- 块 :在Objective C编程中块更常用。 这是一个伟大的function,用于执行大量的代码。 你也可以参考教程来理解: 块教程
请让我,如果有任何其他答案。 我将不胜感激。