在某个时间运行代码

时间:2014-05-22 19:34:54

标签: ios core-data nstimer data-modeling

我正在构建基于用户创建重复活动的应用程序'。每个Event对象都有一天(存储为typedef NS_ENUM)和一个时间(存储为NSDate)和一个持续时间(表示分钟的NSInteger)。每个事件总是每周重复一次。事件存储在Core Data托管的跨设备同步数据库中。并且旨在重复使用,使得他们不需要每周重新创建(因此日期独立的工作日)。事件完成后,会更新一些用户统计信息。

举个例如星期一上午10点开始的活动,持续25分钟。在这种情况下,我希望获得NSDate this Monday at 10:25的{​​{1}}表示(这不是问题),此时,更新用户统计信息,这就是问题所在。

在特定时间执行代码的最佳方法是什么?

我原本想过使用[[NSDate alloc] initWithFireDate:interval:target:selector:userInfo:repeats:]。但是,很难确保target对象已初始化,并且难以同步设备之间的计时器。也就是说,确保每个计时器都设置为同时触发(如果日期,时间或持续时间发生变化)。

我的第二个想法是,使用当前系统时间更新应用程序启动时的统计信息,并回顾之前的事件。但是,如果用户打开了应用程序,我希望统计信息能够实时更新。

非常感谢任何帮助或想法。我也对如何改变模型以更好地解决这个问题持开放态度。

提前致谢。

1 个答案:

答案 0 :(得分:0)

当计时器需要触发时,您的应用可能存在两种可能的情况 - 它是在前台还是在前台。 NSTimer只会在应用程序位于前台时触发(除了少数例外情况,例如在后台执行任务中运行)。

您可以按如下方式处理这两种情况:

  • 使用initWithFireDate计划下一个所需时间的计时器。您应该将目标设置为在应用程序运行时将存在的对象。你可以使用你的UIApplicationDelegate或其他一些单例类。
  • 当应用程序进入后台时,时间无效。
  • 当应用程序返回到前台时,检查自应用程序上次放到后台以来计时器是否应该已经触发。如果是,请运行统计信息更新。安排下一个计时器任务。
  • 如果计时器触发,则应用程序仍处于前台,因此请运行统计信息更新任务,然后安排下一个计时器任务。