В Cocoa есть ли уведомление, на которое я могу зарегистрироваться, который сообщает мне, когда начинается новый день - в 00:00: 01 с утра?
Могу ли я получить уведомление, когда начнется новый день?
Ответ 1
Нет уведомления, о котором я знаю. Вы можете запускать таймер каждый раз, когда начинается новый день:
[[NSTimer alloc] initWithFireDate:midnight
interval:60 * 60 * 24 //one day, in seconds
target:someObj
selector:@selector(someSelector)
userInfo:nil
repeats:YES];
Трюк получает значение NSDate
в полночь. Проверьте Руководство по программированию даты и времени, чтобы узнать, как это сделать с компонентами даты и т.п.
EDIT: см. этот вопрос о том, как получить полночь NSDate
.
Ответ 2
Если это для разработки iPhone, вы также можете прослушать UIApplicationSignificantTimeChangeNotification. Он публикуется чаще, чем приезд в полночь, но когда вы его получите, вы можете просто проверить, находитесь ли вы на полуночи или около полуночи.
Для Mac OS X вам нужно будет сделать то, что предлагает Том Даллинг, но вы также должны следить за изменениями системных часов самостоятельно ( чтобы обновить ваш таймер), а также изменяет текущий часовой пояс.
Ответ 3
Как и в iOS8, вы также можете напрямую прослушивать NSCalendarDayChangedNotification.
Ответ 4
Как упоминалось другими, в iOS 8 вы можете использовать NSCalendarDayChangedNotification. Что касается этого, post дает вам больше информации.
По сути, NSCalendarDayChangedNotification требует, чтобы вы перешли в файл appDelegate и ввели нижеприведенный код в приложение (адаптировано из руководства для Swift 3):
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.dayChangedOperations(notif:)), name:NSNotification.Name.NSCalendarDayChanged, object:nil)
Где "ViewController" - это имя класса одного из моих классов, а "dayChangedOperations" - это имя функции, которую я хочу запускать всякий раз, когда изменяется день.
Количество дней с момента последнего изменения
Обратите внимание, что все, что вы получаете от этого, - это предупреждение о том, что день изменился. Вам не дается количество дней с момента последнего запуска приложения. Поэтому не забудьте сохранить дату в userDefault каждый раз, когда запускается эта функция, поэтому вы можете использовать ее для сравнения позже.