嗯,标题几乎说明了一切。我想要做的是检查日期何时过去。因此,举例来说,让我们说用户正在使用我的应用程序然后他们上午睡觉并在早上检查我的应用程序。当我的应用程序打开时,我需要检查一天是否发生了变化。
此外,我不需要在应用程序终止或在后台或任何内容时知道此信息。我只需要知道当应用程序运行并且用户实际上正在与它进行交互时日期是否已更改。
注意:我查看了与此问题相关的其他Stack Overflow帖子,但没有一个帮助过我。
答案 0 :(得分:5)
实施观察
NSCalendarDayChangedNotification
每当系统的日历日发生变化时,都会发布 按系统日历,区域设置和时区。这个通知有 不提供对象。
如果设备在当天发生变化时处于睡眠状态,则会发出此通知 将在唤醒时发布。只会发布一个通知 如果设备已经睡了好几天就会被唤醒。
无法保证此通知的及时性 将由观察员收到。因此,你不应该依赖于此 在任何确切的时间发布或接收通知。
通知是通过
[NSNotificationCenter defaultCenter]
发布的。
示例:
在applicationDidFinishLaunching
添加
NSNotificationCenter.defaultCenter().addObserver(self, selector:"calendarDayDidChange:", name:NSCalendarDayChangedNotification, object:nil)
并实施方法
func calendarDayDidChange(notification : NSNotification)
{
doSomethingWhenDayHasChanged()
}
或使用块API。
如果包含观察者的类不是应用程序委托类,则可能会在某个时候删除观察者。
答案 1 :(得分:0)
更新vadian对Swift 5的回复:
NotificationCenter.default.addObserver(self, selector:#selector(self.calendarDayDidChange(_:)), name:NSNotification.Name.NSCalendarDayChanged, object:nil)
并实现该方法
@objc private func calendarDayDidChange(_ notification : NSNotification) {
doSomethingWhenDayHasChanged()
}
答案 2 :(得分:0)
如果您更新 UI,为了防止崩溃,请使用以下代码:
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()
}
}