Macos 当一天发生变化时通知?

Macos 当一天发生变化时通知?,macos,cocoa,notifications,Macos,Cocoa,Notifications,WebKit的WebHistory API按日期分隔其项。因此,当一天发生变化时,我需要重新分配任何“昨天”和/或(早些时候)今天(或“明天”!)标签。对此有通知吗?或者我必须依赖NSTimer或-performSelector:withObject:andDelay:或其他技术吗 (当然,替代方法不会自动处理回溯日期。) 附录 在撰写本文时,有两个答案,但第三个答案后来被删除。它的反应最全面。它提到了WWDC-2013第227次会议,该会议讨论了Mavericks中未记录的日期/时间系统的添加

WebKit的WebHistory API按日期分隔其项。因此,当一天发生变化时,我需要重新分配任何“昨天”和/或(早些时候)今天(或“明天”!)标签。对此有通知吗?或者我必须依赖NSTimer或
-performSelector:withObject:andDelay:
或其他技术吗

(当然,替代方法不会自动处理回溯日期。)

附录

在撰写本文时,有两个答案,但第三个答案后来被删除。它的反应最全面。它提到了WWDC-2013第227次会议,该会议讨论了Mavericks中未记录的日期/时间系统的添加。有改进的今天检查和一天的变化通知。你可以退房


(如果被删除的答案的所有者想要放回一些东西,如果可能的话,我会转移答案标志。)我在2013年底得到了我的Mac电脑,并立即将其升级为Mavericks,所以我不关心前Mavericks系统,只有Mavericks的API是可以的。

一种技术是在新的一天开始时设置一个
NSTimer

  • 获取当天的开始日期
    今天的开始日期
    ()
    
  • 创建一个计时器,在今天开始后触发86400秒(刚好是一天后)
  • 如有必要,每天使用计时器
  • 在日期后86400秒触发计时器

    [[NSTimer alloc] initWithFireDate:beginningOfToday
                                 interval:86400
                                   target:`YOUR_TARGET`
                                 selector:@selector(`YOUR_SELECTOR`)
                                 userInfo:nil
                                 repeats:YES];
    
    例如,您的目标可以是
    self
    和您的选择器
    dayDidChange

    对此有通知吗

    不,Mac OS不会在日期发生变化时发送通知

    当一天发生变化时,我需要重新分配任何“昨天”[…]标签

    这取决于显示标签的UI类型。在临时用户界面(如菜单)中,最好在显示用户界面时只计算标签,保持原样

    如果任何用户界面显示标签的时间较长(如侧边栏),最好在一天发生变化时进行更新

    为此,您应该计算下一次更改的时间并设置计时器。此外,您可能希望注册一些通知以检测非标准的日期更改(系统睡眠、调整系统时间、日历更改)


    这就完成了所有这一切,只需发送一个通知。它在iOS和Mac操作系统上都能工作。

    不是每个(日历)日都有86400秒长。@NikolaiRuhe是的。日历的计算会变得非常复杂。youtube上有一段很好的CGPGray视频。但考虑到问题的背景,任何改进都是对代码的浪费。也许考虑DST是值得的,这取决于目标的准确性水平。关于“任何改进都是对代码的浪费”,我想指出几个未解决的问题:1。你的计时器触发时间有一个竞赛条件。它可能会在午夜前关闭,导致一天的更新。2.计时器创建对目标的强引用,可能会造成泄漏。3.在DST更改日,更新将关闭。4.代码未检测到系统的挂钟、时区或日历设置的变化,并将在第二天关闭。@NikolaiRuhe我同意第1点和第4点。我的评论中提到了第3点。至于第2点,编程不仅仅是粘贴代码片段。每次都存在潜在的内存泄漏,必须努力避免它们。请参阅我在回答中提到的WWDC视频,了解为什么这很有可能失败。在某些日历中,一天并不总是24小时。事实上,即使是在公历中,这一点也经常被弄糟。因为我使用文本作为菜单项标题,所以我可以使用菜单验证方法动态生成它。但这需要在菜单项上添加操作。我刚刚注意到Safari没有生成“昨天”菜单项,所以它的“今天”菜单项必须是自定义菜单项。我想我会切换到这一点,而不会动态更改任何菜单标题。没错,没有关于这一点的通知,但正确的方法是使用NSDateFormatter(以及所有常见但不容易学习的类或相关的使用类。)@Uchiugaka当日期发生变化时,如何使用日期格式化程序更新UI?