回调是将一段可执行的代码和一个特定的事件绑定起来,当特定的事件发生时,就会执行这段代码
下面介绍OC中实现回调的一种方式-目标动作对。
在程序开始等待前,要求当某事发生时向指定对象发送某个特定的消息,这里接收消息的对象是目标(target),消息的选择器(selector)是动作(action)。
一 运行循环
事件驱动的程序需要有一个对象,专门负责等待事件的发生。有一个名为NSRunLoop的类,会持续等待着。
实例代码如下
只需这样,运行循环就会等待,程序没有结束,要手动选择product -> stop 结束程序
二 目标动作对
下面要创建一个拥有NSRunLoop对象和NSTimer对象的程序。每隔两秒,NSTimer对象会向其目标发送指定的动作消息。此外还要创建一个BNRLogger类,这个类的实例将被设置为NSTimer对象的目标。
在BNRLogger.h中声明如下
@interface BNRLogger : NSObject
@property(nonatomic) NSDate *lastTime;
- (NSString *)lastTimeString;
- (void)updateLastTime:(NSTimer *)t;
@end
动作方法总是有一个实参,它是传入发送动作消息的那个对象。本例传入的是NSTimer对象。
在BNRLogger.m中实现方法。
#import "BNRLogger.h"
@implementation BNRLogger
- (NSString *)lastTimeString{
static NSDateFormatter *dateFormatter=nil;
if(!dateFormatter)
{
dateFormatter=[[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLog(@"created dateFormatter");
}
return [dateFormatter stringFromDate:self.lastTime];
}
- (void)updateLastTime:(NSTimer *)t{
NSDate *now=[NSDate date];
[self setLastTime:now];
NSLog(@"Just set time to %@",self.lastTimeString);
}
@end
在main.m文件中,创建一个BNRLogger实例,让它成为NSTimer的目标,动作设置为updateLastTime
系统会每隔2.0秒,在控制台输出当前的日期时间。