回調是將一段可執行的代碼和一個特定的事件綁定起來,當特定的事件發生時,就會執行這段代碼
下面介紹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秒,在控制檯輸出當前的日期時間。