iOS NSDate日期时间及NSTimer定时任务

NSDate

NSDate *date = [NSDate date]; // 获取系统当前时间
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"Today HH:mm";
NSString *time = [formatter stringFromDate:date];

[NSDate dateWithTimeIntervalSinceNow:5.0];  // 5.0秒后的时间

NSDate+MJ.h

NSDate *preDate;
[preDate deltaWithNow]; // preDate距离今天的时间元素

NSDateFormatter

NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 真机调试时,需要加上此local;
fmt.local = [[NSLocal alloc] initWithLocalIndentifier:@“en_US”];
fmt.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";
// 根据一个指定的时间格式化器 获取具体时间;
NSDate *createDate = [fmt dateFromString:str];

转换成其它格式

fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *newDate = [fmt stringFromDate:createDate];
// 添加一段时间长度到当前的date;
[date dateByAddingTimeInterval:timeLength];

NSCalendar

// 日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 获得日期的所有元素
NSDateComponents *cmps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:date];
// cmps.year, cmps.month;

NSTimer

通常用于定时更新非界面的操作

1.启动定时器
两种方法:
<1>.调用timerWith…创建的timer,把这个对象手动添加到消息循环中才能启动;

NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop addTimer:timer forMode:NSRunLoopCommonModes];
[timer fire];  // 调用一次执行一次

<2>.调用scheduleTimer…创建的timer,自动启动(创建完成后自动启动);

2.停止计时器

[timer invalidate]; timer = nil;

一旦停止了计时器,那这个计时器就不能再重用了,下次必须重新创建一个新的计时器对象;因为当调用完invalidate方法后,这个计时器就已经废了无法重用了,所以需要将timer设置为nil;

线程优先级

默认情况下,UIView的优先级要高于timer,所以如果在timer里面执行改变UIView的方法,需要给timer设置优先级;

NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop addTimer:timer forMode:NSRunLoopCommonModes];  // 或者

严格意义上讲 CADisplayLink 并不是计时器控件, 它是与显示器刷新频率一致的。比如显示的刷新频率是60赫兹, 那么 CADisplayLink 就会每秒钟执行60次。正是因为这个原因所以有时也把 CADisplayLink 当做计时器控件来使用。

CADisplayLink *display = [CADisplayLink displayLinkWithTarget:self selector:@(update)];
// 将CADisplayLink加入到消息循环中;
[display addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[display invalidate];  display = nil;

与NSTimer的区别

NSTimer(时间间隔比较大,1秒,几秒)
CADisplayLink(时间间隔比较小,不到1秒)

dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"Log a msg after 2s");
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值