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");
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章