我的应用程序中的一个视图有一个我想与系统保持同步的时钟。许多堆栈问题都围绕着 NSTimer,但在此之前,我想检查是否有我可以注册的系统通知每分钟触发一次。
这样的事情存在吗?我正在浏览 NSNotificationCenter 但到目前为止什么都没有。
我的应用程序中的一个视图有一个我想与系统保持同步的时钟。许多堆栈问题都围绕着 NSTimer,但在此之前,我想检查是否有我可以注册的系统通知每分钟触发一次。
这样的事情存在吗?我正在浏览 NSNotificationCenter 但到目前为止什么都没有。
您可以通过计算分钟的下一次更改来使用NSTimer
'sinitWithFireDate
在分钟内触发:
NSDate *currentDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"ss"];
int currentTimeSeconds = [dateFormatter stringFromDate:currentDate].intValue;
NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:60 - currentTimeSeconds];
NSTimer *updateTimer = [[NSTimer alloc] initWithFireDate:fireDate
interval:60
target:self
selector:@selector(updateSelector)
userInfo:nil
repeats:YES];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:updateTimer forMode:NSDefaultRunLoopMode];
据我所知,没有NSNotificationCenter
电话存在。这真的就像设置一个NSTimer
. 只要您将间隔设置NSTimer
为1 秒,就可以了。以下是我如何在我的一个应用程序的标签中使用时间/日期。
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self
selector:@selector(clockDateAndTime:) userInfo:nil repeats:YES];
-(void)clockDateAndTime:(NSTimer*)timer
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSDate * date = [NSDate date];
[formatter setDateFormat:@"MMM dd, yyyy hh:mm:ss a"];
[lblLocalDate setText:[formatter stringFromDate:date]];
}
上面beggs的答案是正确的......这里是为了迅速:
let dateComp = self.calendar.components(NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.MonthCalendarUnit | NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute | NSCalendarUnit.CalendarUnitSecond, fromDate: NSDate())
dateComp.minute += 1
dateComp.second = 0
println(self.calendar.dateFromComponents(dateComp)!)
let myTimer = NSTimer(fireDate: self.calendar.dateFromComponents(dateComp)!, interval: 60, target: self, selector: "refreshCountdownNextMeal", userInfo: nil, repeats: true)
let runloop = NSRunLoop.currentRunLoop()
runloop.addTimer(myTimer, forMode: NSDefaultRunLoopMode)
我不必告诉你,每分钟调用一次定时器不如每分钟 60 次更好,对吧?;-)
@beggs 答案的更直接的 swift 2 翻译:
let currentDate = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "ss";
let currentTimeSeconds = Double(dateFormatter.stringFromDate(currentDate))
let fireDate = NSDate(timeIntervalSinceNow: 60 - currentTimeSeconds!)
let timer = NSTimer(fireDate: fireDate, interval: 60, target: self, selector: "minuteLoop", userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)