我正在构建一个带有重复任务功能的待办事项列表。
在核心数据模型中,我有一个存储的二进制属性和包含所有重复日期的数组。
e.g [NSDate date],
[NSDate date] + 1 week,
[NSDate date] + 2 week, etc...
所以添加的每个待办事项都会有一个重复日期的数组。
我需要查看所有日期(包含重复日期数组中的内容),如果这些日期中的任何日期是今天的日期,我想获得该待办事项并在tableview中显示。
我的第一个是获取数据库中的所有todo,循环抛出所有日期以查看它们中的任何一个是否与今天的日期匹配...但这似乎效率很低,特别是如果数据库包含很多tods ..
这里最好的方法是什么?
由于
答案 0 :(得分:3)
不是一个真正的答案,但我写了一个我想象的全面的反复出现的事件对象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
答案 1 :(得分:1)
你可以用谓词来做到这一点:
[NSPredicate predicateWithFormat:@"SUBQUERY(dates, $d, $d.date BETWEEN {%@, %@}).@count > 0", dayBeginning, dayEnd];
我假设待办事项和日期之间的关系名为dates
。 Here您可以找到如何正确设置dayBeginning
和dayEnd
。