5

アプリケーションのビューには、システムとの同期を維持したいクロックがあります。NSTimer に関する Stack に関する質問が多数ありますが、それを行う前に、毎分起動される登録可能なシステム通知があるかどうかを確認したいと思います。

そのようなものは存在しますか?私は NSNotificationCenter を調べていますが、これまでのところ何もありません。

4

4 に答える 4

9

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];
于 2012-08-02T04:40:08.663 に答える
2

NSNotificationCenter私が知っている呼び出しはありません。を設定するのと同じくらい簡単NSTimerです。間隔NSTimer1 秒に設定している限り、問題ありません。アプリのラベルで時刻/日付を使用する方法を次に示します。

[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]];
}
于 2012-07-09T21:10:09.730 に答える
0

@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)
于 2016-02-24T21:21:17.097 に答える
0

上記の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 回呼び出すよりも優れていると言う必要はありませんよね? ;-)

于 2014-12-23T19:36:47.207 に答える