回调(Callbacks)-目标动作对

来源:互联网 发布:怎样快速养淘宝小号 编辑:程序博客网 时间:2024/06/05 16:31

  我们之前学的程序,会向对象发送消息,并告诉这些对象应该做什么,运行后会立刻退出。

  这一章我们学习一个程序是一个事件驱动的程序,这个程序能保持运行,等待事件,并作出相应的处理。除非你关闭程序,程序不会自己退出,它会一直在后台等待事件的发生。 

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

  在Objective-C中,有四种途径可以实现回调。

目标-动作对:在程序开始等待前,要求“当事件发生时,向指定的对象发送某个特定的消息”。这里接受消息的对象是目标,消息的选择器是动作。

辅助对象:在程序开始等待前,要求“当事件发生时,向遵守相应协议的辅助对象发送消息”。委托对象和数据源是常见的辅助对象。

通知:苹果公司提供了一种称为通知中心的对象。在程序开始等待前,可以告知通知中心“某个对象正在等待某些特定的通知。当其中的某个通知出现时,向指定的对象发送特定的消息”。当事件发生时,相关的对象会向通知中心发布通知,然后由通知中心将通知转发给正在等待该通知的对象。

Block对象:Block是一段可执行的代码。在程序开始等待前,声明一个Block对象,当事件发生时,执行这段Block对象。

一 运行循环

  事件驱动的程序需要有一个对象,专门负责等待事件的发生。iOS系统有一个NSRunLoop类,NSRunLoop实例会持续等待着,当特定的事件发生的时候,就会向相应的对象发送消息。NSRunLoop实例会在特定的事件发生时触发回调。

创建一个新项目,名称为Callbacks.

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){    @autoreleasepool {                [[NSRunLoop currentRunLoop] run];        //创建一个运行循环,没有返回run方法,运行循环正在等待事件的发生            }    return 0;}


二 目标-动作对

  目标-动作对:在程序开始等待前,要求“当事件发生时,向指定的对象发送某个特定的消息”。这里接受消息的对象是目标,消息的选择器是动作。

  计时器使用的是目标-动作对机制。创建计时器时,要设定延迟,目标和动作。在指定延迟时间后,计算机会向其目标发送指定的动作消息。下面创建一个拥有NSRunLoop对象和NSTimer对象的程序。每个2秒,NSTimer会向其目标发送指定的动作消息。此外,创建一个BNRLogger类,这个类的实例被设置为NSTimer对象的目标。

在BNRLogger.h中声明相应的动作方法:

#import <Foundation/Foundation.h>@interface BNRLogger : NSObject@property (nonatomic) NSDate *lastTime;-(NSString *)lastTimeString;-(void)updateLastTime:(NSTimer *)t; //动作方法中总有一个实参,这个实参是传入发送动作消息的那个对象@end

在BNRLogger.m中实现方法:

#import "BNRLogger.h"@implementation BNRLogger-(NSString *)lastTimeString{    static NSDateFormatter *dateFormatter = nil;    if(! dateFormatter)    {        dateFormatter = [[NSDateFormatter alloc] init];        [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];        [dateFormatter setTimeStyle: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:

#import <Foundation/Foundation.h>#import "BNRLogger.h"int main(int argc, const char * argv[]){    @autoreleasepool {        BNRLogger *logger = [[BNRLogger alloc] init];        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:logger selector:@selector(updateLastTime:) userInfo:nil repeats:YES];        //目标target:logger 选择器selector:@selector(updateLastTime:)                [[NSRunLoop currentRunLoop] run];        //创建一个运行循环,没有返回run方法,运行循环正在等待事件的发生            }    return 0;}
程序应该会没隔2秒在控制台输出当前的日期和时间。这个程序完成了,在指定的时刻触发时间。所以适用目标-动作对来实现回调。











原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 初中孩子成绩下降怎么办 给孩子开家长会怎么办 读初三很难受怎么办 初三了英语很差怎么办 数学考30分怎么办 小学生阅读理解能力差怎么办 小学一年级数学差怎么办 小学一年级数学很差怎么办 初中生脸上长斑怎么办 初中生脸上长痘怎么办 初中成绩不好高中怎么办 农村老人去城里怎么办 留守儿童想妈妈怎么办 教师档案丢失了怎么办 转正定级表丢失怎么办 娃娃写作业慢怎么办 写作业眼睛疼怎么办 发生火灾怎么办大班教案 大班健康发生火灾怎么办 学生上课不提问怎么办 入户通知单丢了怎么办 打架后还来找事该怎么办 着火了怎么办教案视频 电脑一小半黑屏怎么办 绝地求生闪退怎么办 win7没浏览器了怎么办 浏览器被删除了怎么办 把快捷方式删了怎么办 ie文件找不到了怎么办 ie文件不存在了怎么办 大学素质分不够怎么办 素拓学分不够怎么办 大学毕业之前素拓分拿不满怎么办 武汉幼儿医保卡怎么办 养老院护工欺老人怎么办 皮肤毛孔粗大有痘印痘坑怎么办 额头上毛孔大怎么办 额头皮肤毛孔大怎么办 脸部粗糙毛孔大怎么办 脸上有痘印毛孔粗大怎么办 毛孔粗大痘印怎么办