【问题标题】:Core data: Repeating task核心数据:重复任务
【发布时间】:2013-10-17 08:35:10
【问题描述】:

我正在构建一个具有重复任务功能的待办事项列表。

在核心数据模型中,我有一个二进制属性,用于存储和排列所有重复日期。

    e.g [NSDate date], 
        [NSDate date] + 1 week, 
        [NSDate date] + 2 week, etc... 

所以每个添加的待办事项都会有一个包含重复日期的数组。

我需要查看所有日期(包含在重复日期数组中),如果这些日期中的任何一个是今天的日期,我想获取该待办事项并在表格视图中显示它。

我的第一个方法是获取数据库中的所有待办事项,循环抛出所有日期以查看它们是否与今天的日期匹配......但这似乎效率很低,特别是如果数据库包含很多 tods..

这里最好的方法是什么?

谢谢

【问题讨论】:

  • 你试过什么?重复日期是什么意思?请详细说明您的问题。
  • 谢谢。我更新了我的问题
  • 如果我要实现这个,我会有一个知道如何计算它何时发生的 event 类。然后你查询一个 event 实例,它返回YES 任何符合正确模式的日期。例如 (originalDate + [0..n] 周)事件可能包括指定更改日程或排除日期/时间的子事件。
  • 您不必在数据库中存储和维护大量单独的事件。
  • 我继续并发布了我想象它如何工作的草图......

标签: ios objective-c core-data


【解决方案1】:

不是一个真正的答案,但我写了我想象的一个全面的重复事件对象 API 的样子。我认为它很容易实现,您可以轻松地将其保存在 Core Data 中。

// every tuesday and thursday
// every other month
// every first tuesday


@interface Event : NSManagedObject
@property ( nonatomic, copy ) NSDate * when ;
@property ( nonatomic, copy ) NSTimeInterval duration ; // set to 24hrs for all day event

@property ( nonatomic, strong ) NSArray * repeatPatterns ; // array of EventRepeatPattern. (nil/empty means non-repeating)
@property ( nonatomic, copy ) NSDate * endDate ; // when repeats should end

@property ( nonatomic, strong ) NSArray * excludedOccurrences ; // array of Event giving times main event should *not* occur (to allow deleting individual day from repeating schedule)

-(BOOL)occursOnDay:(NSDate*)day ; // does Event have an occurrence on day?

@end

enum EventRepeatWeekdayMask
{
    EventRepeatWeekday_Monday
    , EventRepeatWeekday_Tuesday
    , EventRepeatWeekday_Wednesday
    , EventRepeatWeekday_Thursday
    , EventRepeatWeekday_Friday
    , EventRepeatWeekday_Saturday
    , EventRepeatWeekday_Sunday
} ;

enum EventRepeatOrdinal
{
    EventRepeatOrdinal_First
    , EventRepeatOrdinal_Second
    , EventRepeatOrdinal_Third
    , EventRepeatOrdinal_Fourth
    , EventRepeatOrdinal_Last = -1
} ;

@interface EventRepeatPattern
+(instancetype)every:(NSDateComponents*)interval ;
+(instancetype)on:(EventRepeatWeekdayMask)mask ;
+(instancetype)on:(EventRepeatOrdinal)ordinal weekdays:(EventRepeatWeekdayMask)mask ;

-(BOOL)occursOnDay:(NSDate*)day forEvent:(Event*)event ; // given `event`, does it occur on `day` based on this repeat pattern?

@end

【讨论】:

    【解决方案2】:

    你可以用谓词做到这一点:

    [NSPredicate predicateWithFormat:@"SUBQUERY(dates, $d, $d.date BETWEEN {%@, %@}).@count > 0", dayBeginning, dayEnd];
    

    我假设待办事项和日期之间的关系被命名为datesHere你可以找到如何正确设置dayBeginningdayEnd

    【讨论】:

    • 感谢您的建议。我收到错误“无法解析格式字符串”:@"ANY (dates.date >= %@ AND dates.date
    • @user1251004:您是否在 Todo 实体上执行此提取请求?
    • 是的,没错。 Todo 与另一个名为 RepeateDates 的实体存在一对多关系,我在其中存储所有即将到来的重复日期
    • 弄清楚,必须这样做:@"(ANY dates.date >= %@) AND (ANY dates.date
    • @user1251004:我已经通过关注this answer 修正了我的答案。
    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多