NSDate или любой из его родных братьев имеет обратный вызов, когда время меняется? - PullRequest
1 голос
/ 01 апреля 2012

Я безуспешно искал на этом.

Вот ситуация:

Я создаю приложение, в котором будут часы, и мне нужно отобразить точноевремя;часы, минуты и секунды.

Я могу запускать интервал каждую секунду, проверять новое время и делать свои обновления - не проблема.Но ... это не точно.Он всегда будет отключен на несколько миллисекунд, потому что я устанавливаю начало отсчета секунд.

Вопрос, есть ли какой-либо тип обратного вызова, протокол, делегат и т. Д., Который сообщит программе, когда время изменится?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2012

NSTimer - это путь.

Запланируйте это ...

NSTimeInterval interval = 1.0;  // the resolution of the clock
[NSTimer scheduledTimerWithTimeInterval:interval
                                 target:self
                               selector:@selector(timerFired:)
                               userInfo:nil
                                repeats:YES];

Когда он выстрелит ...

- (void)timerFired:(NSTimer *)timer {

    NSDate *now = [NSDate date];
    // update your UI knowing now
}

Это будет очень точноотносительно времени устройства.Обновление дисплея займет некоторое время после того, как назначено текущее время, но это тривиальная ** сумма относительно разрешения в секундах.

** Не так мало, как, скажем, время, необходимое для прохождения фотонов от экрана к сетчатке пользователя, но все же очень мало.

0 голосов
/ 01 апреля 2012

Я прошу прощения, если я не очень ясно дал понять сначала. То, что я искал, было не способом создания таймера, а способом точной синхронизации таймера со временем устройства.

Итак, вот что я придумал:

NSInteger seconds = ((NSInteger)CFAbsoluteTimeGetCurrent() % 60);
while (true) {
    NSInteger currentSeconds = ((NSInteger)CFAbsoluteTimeGetCurrent() % 60);

    if(seconds != currentSeconds){
        NSLog(@"Seconds changed");
        // fire my timer here
        break;
    }

    NSLog(@"currentSeconds: %i",currentSeconds);
    seconds = currentSeconds;
}

Как вы можете видеть в журналах, NSLog (@ "Секунды изменились") срабатывает точно при изменении секунд, и здесь я могу вызвать таймер, чтобы запустить 1-секундный интервал и обновить мой пользовательский интерфейс, так далее... Вы можете очень легко определить, взглянув на метку времени в журнале, секунды разделены.

....
2012-04-01 15:02:03.996 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.996 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.997 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.997 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.997 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.998 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.998 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.998 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.999 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.999 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:03.999 TestApp[75701:f803] currentSeconds: 3
2012-04-01 15:02:04.000 TestApp[75701:f803] Seconds changed
0 голосов
/ 01 апреля 2012

Просто мысль, а как насчет KVO?

 [NSDate addObserver:self forKeyPath:@"date" options:0 context:NULL];

У меня нет доступа к IDE прямо сейчас, поэтому я не могу проверить это.

В другой заметкепочему бы вам просто не использовать NSTimeInterval меньше 1 (например, 0,1, десять раз в секунду) для таймера обновления?

...