アプリケーションのビューには、システムとの同期を維持したいクロックがあります。NSTimer に関する Stack に関する質問が多数ありますが、それを行う前に、毎分起動される登録可能なシステム通知があるかどうかを確認したいと思います。
そのようなものは存在しますか?私は NSNotificationCenter を調べていますが、これまでのところ何もありません。
アプリケーションのビューには、システムとの同期を維持したいクロックがあります。NSTimer に関する Stack に関する質問が多数ありますが、それを行う前に、毎分起動される登録可能なシステム通知があるかどうかを確認したいと思います。
そのようなものは存在しますか?私は NSNotificationCenter を調べていますが、これまでのところ何もありません。
NSTimer
'sを使用initWithFireDate
して、その分の次の変更を計算することにより、その分に起動できます。
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の回答のより文字通りの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)
上記のbeggsの答えは正しいです...ここにswiftの場合があります:
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)
タイマーを 1 分に 1 回呼び出す方が、1 分間に 60 回呼び出すよりも優れていると言う必要はありませんよね? ;-)