03-NSTimer的简单使用

来源:互联网 发布:java解压包的后缀 编辑:程序博客网 时间:2024/05/01 08:43

帮忙看了一个程序,他以为是委托用错了,打印不出信息,我发现委托并没有用错,是他在函数里边的定时器没有正确使用,示例:

-(void)need{    [NSTimer timerWithTimeInterval:2 target:self selector:@selector(wantNeed:) userInfo:nil repeats:YES];}
在这个need方法中,他使用了NSTimer的类方法+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;进行初始化,想要每隔2s调用一次wantNeed:方法,他写的这个方法并不能实现。

故修改如下:

-(void)need{    NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(wantNeed:) userInfo:nil repeats:YES];//该类方法需要手动addTimer:forMode: 将timer添加到一个runloop中。    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];//获得当前thread的Run loop    //现在,只需要将定时器添加到运行循环中即可:    [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];}

后来查了一下资料,发现这样更简单:

-(void)need{    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(wantNeed:) userInfo:nil repeats:YES];//scheduled的初始化方法将以默认直接添加到当前的runloop中.}

自己总结一下NSTimer的使用方法:

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

参数详解:

scheduledTimerWithTimeInterval:(NSTimeInterval)seconds  
设置一个时间间隔,以秒为单位,一个>0的浮点类型的值,如果该值<0,系统会默认为0.1
target:(id)aTarget
表示发送的对象,如self
selector:(SEL)aSelector
方法选择器,在时间间隔内,选择调用一个实例方法
userInfo:(id)userInfo
此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。
repeats:(BOOL)yesOrNo
当YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。

- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(id)ui repeats:(BOOL)repNS_DESIGNATED_INITIALIZER;

该实例方法与上面的方法功能类似,多了一个date参数,该参数是设置第一次fire的时间(多少时间后触发,s为单位)。

- (void)fire;

其实他并不是真的启动一个定时器,从之前的初始化方法中我们也可以看到,建立的时候,在适当的时间,定时器就会自动启动。那这个方法是干什么的呢。fire并不是启动一个定时器,只是提前触发而已,调用该方法不会改变fireDate

- (void)invalidate;

//如果定时器在运行if ([self.timer isValid]) {//取消定时器[timer invalidate];timer = nil;}

停止timer的运行,但这个是永久的停止:(注意:停止后,一定要将timer赋空,否则还是没有释放。)

要想实现:先停止,然后再某种情况下再次开启运行timer,可以浏览这篇文章。


0 0
原创粉丝点击