Проверка, когда дата прошла - Swift

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

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

Примечание. Я просмотрел другие сообщения о переполнении стека, относящиеся к этой проблеме, но ни одна из них не помогла мне.

3 ответа

Решение

Осуществить, чтобы наблюдать

NSCalendarDayChangedNotification

Публикуется всякий раз, когда меняется календарный день системы, как это определяется системным календарем, языковым стандартом и часовым поясом. Это уведомление не предоставляет объект.

Если устройство спит, когда день меняется, это уведомление будет опубликовано при пробуждении. При пробуждении будет опубликовано только одно уведомление, если устройство спало несколько дней.

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

Уведомление публикуется через [NSNotificationCenter defaultCenter],

Пример:

В applicationDidFinishLaunching добавлять

NSNotificationCenter.defaultCenter().addObserver(self, selector:"calendarDayDidChange:", name:NSCalendarDayChangedNotification, object:nil)

и реализовать метод

func calendarDayDidChange(notification : NSNotification)
{
   doSomethingWhenDayHasChanged()
}

или используйте блочный API.

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

Обновите ответ vadian на Swift 5:

NotificationCenter.default.addObserver(self, selector:#selector(self.calendarDayDidChange(_:)), name:NSNotification.Name.NSCalendarDayChanged, object:nil)

и реализуем метод

@objc private func calendarDayDidChange(_ notification : NSNotification) {
    doSomethingWhenDayHasChanged()
}

Если вы обновите пользовательский интерфейс, для предотвращения сбоев используйте этот код:

      override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector:#selector(self.calendarDayDidChange(_:)), name:NSNotification.Name.NSCalendarDayChanged, object:nil)
}

@objc private func calendarDayDidChange(_ notification : NSNotification) {
    DispatchQueue.main.async { [weak self] in
        self?.setupLabel()
    }
}
Другие вопросы по тегам