Можно ли определить, когда на часах строки состояния меняется «Минута»? - PullRequest
3 голосов
/ 12 ноября 2011

У меня сложная проблема, которую я хочу описать, поэтому я сохраню ее и просто подытожу, что я пытаюсь сделать. Я хочу получить уведомление, когда время в строке состояния меняется, чтобы я мог пересчитать время до. В настоящее время я вычисляю время, пока все отлично, но есть то 1-минутное окно, в котором мои вычисления и где отметка времени не совпадает ... все зависит от того, когда они открывали приложение, по сравнению с тем, где были часы «секунд» на iPhone, когда они открыли это.

Короче говоря, можем ли мы определить, когда меняется минута в строке состояния? Если да, то как?

Спасибо!

Ответы [ 5 ]

10 голосов
/ 13 ноября 2011

Даже проще, чем ответ Эмилио - когда ваше представление загружается (или когда вы хотите вызвать событие), просто проверьте часть секунд текущей даты (например, с помощью NSCalendar), запланируйте таймер, который будет срабатывать за 60-секунд ( будет следующая минута, ноль секунд) и, наконец, запланируйте новый таймер, который срабатывает каждые 60 секунд.

6 голосов
/ 05 июля 2013

По предложению @ mja:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSSecondCalendarUnit fromDate:[NSDate date]];
NSInteger currentSecond = [components second];

//+1 to ensure we fire right after the minute change
NSDate *fireDate = [[NSDate date] dateByAddingTimeInterval:60 - currentSecond + 1];
NSTimer *timer = [[NSTimer alloc] initWithFireDate:fireDate
                                          interval:60
                                            target:self
                                          selector:@selector(YOURSELECTORHERE)
                                          userInfo:nil
                                           repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

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

2 голосов
/ 13 февраля 2018

На основе примера кода @ SG1, но в Swift:

        //calculate fireDate on every minute's first second
        let now: Date = Date()
        let calendar: Calendar = Calendar.current
        let currentSeconds: Int = calendar.component(.second, from: now)
        //init timer
        self.timer = Timer(
            fire: now.addingTimeInterval(Double(60 - currentSeconds + 1)),
            interval: 60 /*seconds*/,
            repeats: true,
            block: { (t: Timer) in
                self.sendNotification()
        })
        //start timer
        RunLoop.main.add(self.timer, forMode: RunLoopMode.defaultRunLoopMode)

        private func sendNotification(){
        ...
        }
2 голосов
/ 12 ноября 2011

Это то, что я бы сделал:

Когда приложение запустится, я бы запустил таймер, который обновлялся бы каждую секунду, чтобы проверять, когда время меняется.находя изменение времени, я бы лишил законной силы этот таймер и запустил его, который срабатывал бы каждую минуту.

Этот минутный таймер будет синхронизирован с задержкой не более секунды с часами в строке состояния.1007 *

0 голосов
/ 12 ноября 2011

Нет такого уведомления, поэтому я думаю, вам нужно написать код, который довольно часто опрашивает время.Для этого я бы создал источник цикла выполнения, добавил его в общие режимы и позволил ему проверить, является ли текущий NSTimerInterval, поскольку ваша любимая контрольная дата, больше или равен некоторому предварительно рассчитанному NSTimeInterval, который содержит временной интервал дляследующая полная минута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...