Ios 核心数据:重复任务

Ios 核心数据:重复任务,ios,objective-c,core-data,Ios,Objective C,Core Data,我正在构建一个带有重复任务功能的待办事项列表 在核心数据模型中,我有一个二进制属性,用于存储和排列所有重复日期 e.g [NSDate date], [NSDate date] + 1 week, [NSDate date] + 2 week, etc... 因此,添加的每个todo都将有一个带有重复日期的数组 e.g [NSDate date], [NSDate date] + 1 week, [NSD

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

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

    e.g [NSDate date], 
        [NSDate date] + 1 week, 
        [NSDate date] + 2 week, etc... 
因此,添加的每个todo都将有一个带有重复日期的数组

    e.g [NSDate date], 
        [NSDate date] + 1 week, 
        [NSDate date] + 2 week, etc... 
我需要查看所有日期(包含在repeat dates数组中),如果这些日期中有任何一个是todays date,我希望得到todo并在tableview中显示它

我的第一个想法是获取数据库中的所有todo,循环抛出所有日期,查看其中是否有与todays日期匹配的日期。。。但这似乎效率很低,尤其是当数据库包含大量TOD时

这里最好的方法是什么


谢谢

您可以使用谓词执行此操作:

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

我假设TODO和日期之间的关系被命名为
dates
。您可以找到如何正确设置
日开始
日结束

您可以使用谓词:

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

我假设TODO和日期之间的关系被命名为
dates
。您可以找到如何正确设置
日开始
日结束

这并不是一个真正的答案,但我编写了一个我想象中的全面循环事件对象API。我认为这将非常容易实现,并且您可以轻松地将其保存在核心数据中

// 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

这不是一个真正的答案,但我写下了我想象中的一个全面的循环事件对象API的样子。我认为实现起来很容易,而且您可以很容易地将其保存在核心数据中

// 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


你试过什么?重复约会是什么意思?请详细说明你的问题。谢谢。我更新了我的问题如果我要实现这个,我会有一个事件类,知道如何计算它发生的时间。然后查询一个事件实例,它会为遵循正确模式的任何日期返回
YES
。例如(原始日期+0..n]周)。事件可能包括指定对计划或排除日期/时间的更改的子事件。您不必在数据库中存储和维护大量单个事件。我继续并发布了一个草图,描述了我认为它是如何工作的…您尝试了什么?重复约会是什么意思?请详细说明你的问题。谢谢。如果我要实现这个问题,我更新了我的问题,我会有一个事件类,它知道如何计算它发生的时候。然后查询一个事件实例,它会为遵循正确模式的任何日期返回
YES
。例如(原始日期+0..n]周)。事件可能包括指定对计划或排除日期/时间的更改的子事件。您不必在数据库中存储和维护大量单独的事件。我继续并发布了一个我想象它如何工作的草图…感谢您的建议。我收到错误“无法解析格式字符串”,错误为:@“ANY”(dates.date>=%@和dates.date@user1251004:您是否正在对
Todo
实体执行此提取请求?是的,这是正确的。Todo与另一个名为RepeateDates的实体有多对多关系,我将所有即将到来的重复日期存储在该实体中。配置它,必须执行此操作:@“(ANY dates.date>=%@)和(ANY dates.date@user1251004:我已通过以下方式修复了我的答案。感谢您的建议。我收到错误“无法解析格式字符串”,错误为:@“ANY”(dates.date>=%@和dates.date@user1251004:您是否正在对
Todo
实体执行此提取请求?是的,这是正确的。Todo与另一个名为RepeateDates的实体有多对多关系,我将所有即将到来的重复日期存储在该实体中。配置它,必须执行此操作:@“(ANY dates.date>=%@)和(ANY dates.date@user1251004:我已经通过以下方式修正了我的答案。