【问题标题】:Checking for a Day Change - Timezone Adjusted检查一天的变化 - 时区调整
【发布时间】:2015-12-22 23:41:50
【问题描述】:

我刚刚尝试创建一些代码(粘贴在下面)来检查一天的变化。不过,现在I'm reading 有一个特殊的换天功能。

NSCalendarDayChangedNotification

显然它适用于 iOS8 及更高版本。但人们一直在使用“你可以听”这句话……好像使用该功能就像调到广播电台一样。我查了一下,上次 WWDC 提供了一个演示文稿,里面有一些相关的代码:

对一天的变化做出反应 • 您可能希望在 日期变化 NSCalendarDayChangedNotification • 示例

noteCenter = [NSNotificationCenter defaultCenter];
observer = [noteCenter addObserverForName:NSCalendarDayChangedNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
// your code here
}];

我的问题

我找到的 PDF 并没有说太多。所以我的问题是这个功能是如何工作的? PDF 让它看起来真的就是这么简单,把代码粘贴进去,我就完成了。真的吗?它会根据时区进行调整吗?我是否必须启用它所引用的通知中心?

我的代码(不确定是否可行):

    //Find out if it's a new day
    let lastDateUsed_NSDefault = NSUserDefaults.standardUserDefaults()
    if let endOf_LastDateUsed = lastDateUsed_NSDefault.objectForKey("lastDateUsed") as! NSDate! {
        print("Success! NSUserDefault key: 'lastDateUsed' returned \(endOf_LastDateUsed)")
        //Check if the day has changed

        let calendar = NSCalendar.currentCalendar()
        let startOfToday = calendar.startOfDayForDate(now)

        if endOf_LastDateUsed.compare(startOfToday) == NSComparisonResult.OrderedAscending {
            //endOf_LastDateUsed is greater than startOfToday.
            print("Do nothing! Last date used must have been today!")
        } else if endOf_LastDateUsed.compare(startOfToday) == NSComparisonResult.OrderedAscending {
            //Day has changed. Run alert.


            //Save "endOfToday" date value to NSDefault
            let endOfToday = startOfToday.dateByAddingTimeInterval(24 * 60 * 60)
            NSUserDefaults.standardUserDefaults().setObject(endOfToday, forKey:"lastDateUsed")
            print("Time stored in NSDefault: \(endOfToday)")
        }

    }
    else {
        print("Failure! NSUserDefault key: 'lasteDateUsed' returned nothing. No record.")
        //First time user - Set end of today
        let calendar = NSCalendar.currentCalendar()
        let startOfToday = calendar.startOfDayForDate(now)
        print("startOfToday: \(startOfToday)")
        let endOfToday = startOfToday.dateByAddingTimeInterval(24 * 60 * 60)
        //Store
        NSUserDefaults.standardUserDefaults().setObject(endOfToday, forKey:"lastDateUsed")

        print("Time stored in NSDefault: \(endOfToday)")
    }

【问题讨论】:

    标签: swift timezone nsdate nsnotificationcenter


    【解决方案1】:

    documentation(诚然,比我希望的要难找到)相当清晰:

    在系统日历日发生变化时发布,由系统日历、区域设置和时区确定。

    所以是的,它应该适当地处理夏令时更改,因为它知道时区。我不知道启用通知中心,但通过调整设备上的系统时钟或时区并查看会发生什么,这应该很容易测试。

    (文档中不清楚的是,如果通过手动干预更改日期,例如通过以直接更改系统时间或时区的方式更改系统时间或时区,是否会触发此事件日期。值得您尝试一下。)

    【讨论】:

    • 谢谢乔恩。我尝试实现它并得到编译器错误,说缺少逗号,所以我猜 Apple 没有提供 read to use 代码!当我阅读文档时,我也开始质疑这个新的 iOS8 代码是否能实现我想要的:“检查一天变化的代码”。文档说“如果设备在一天变化时处于睡眠状态,则此通知将在唤醒时发布。只会发布一个通知......”。在我的 viewDidLoad 中运行它是否会返回自我的应用上次使用以来这一天是否发生了变化?网上几乎没有关于此的阅读内容
    • @DaveG:运行什么?您发布的代码,还是事件订阅?我注意到,在您的代码中,您假设所有的日子都是 24 小时……面对夏令时,这是一个危险的假设。
    • 事件订阅。我明白夏令时是如何把事情搞砸的。我想最终我主要关心的是使用最好的方法来检测自上次使用我的应用程序以来的一天变化。我想如果 iOS8 增加了一些东西,我应该使用它,但如果你能提出一种经验丰富的开发人员使用的最佳实践,我将不胜感激。
    • @DaveG:我不认为事件订阅真的是为了满足那种要求——我认为它更适用于需要在运行时更新某些东西的应用程序。不是 iOS 开发人员,我不知道这里的最佳实践细节 - 但你应该仔细考虑如果用户手动更改时区或调整系统时钟,你想要发生什么。不过,我不认为您需要在一天的结束和开始时都进行锻炼。
    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多