iOS学习日记(十二)目标-动作对

回调是将一段可执行的代码和一个特定的事件绑定起来,当特定的事件发生时,就会执行这段代码

下面介绍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秒,在控制台输出当前的日期时间。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章