核心数据对象应在午夜自动排序

时间:2014-02-17 19:39:10

标签: ios core-data nsdate

我正在为iOS创建待办事项列表应用。待办事项列表分为几个部分:

第0节 - >过期物品

第1节 - >今日物品

第2节 - >明天的项目

第3节 - >即将开始的项目

第4节 - > SOMEDAY项目

第5节 - >已完成的项目

正如您可能想象的那样,在午夜之后,剩余的TODAY项目应该传递到OVERDUE部分,明天的项目应该传递到TODAY部分,并且一些UPCOMING项目应该传递到TOMORROW部分。

现在的应用程序,如果用户在早上启动应用程序,所有项目都会显示在各自的部分中。

当用户在午夜之前使用应用程序并且只是通过午夜时,会出现问题。这些项目不会自动传递到正确的部分。

我只能在模拟器上测试应用程序,但我想这个问题也会在真实设备上发生。

所有项目都有一个名为todoDueDate的属性,并且所有项目都具有日期值的相同时间部分,所有项目时间都设置为上午10:00。

要将项目分配到我正在使用名为sectionIdentifier的transient属性的部分,该属性在名为ToDoItem的NSManagedObject子类中定义。

这里有方法:

-(NSString *)sectionIdentifier{

    [self willAccessValueForKey:@"sectionIdentifier"];
    NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"];
    [self didAccessValueForKey:@"sectionIdentifier"];




    if (!tmp){


        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);

        NSDate *today = [NSDate date];
        NSDate *date = self.todoDueDate;

        NSDateComponents *components = [[NSDateComponents alloc] init];
        [components setCalendar:calendar];
        [components setYear:2065];
        [components setMonth:11];
        [components setDay:12];

        NSDate *dateFuturoSomeday = [calendar dateFromComponents:components];

        NSCalendar *calendar1 = [NSCalendar currentCalendar];
        NSDateComponents *components1 = [[NSDateComponents alloc] init];
        [components1 setCalendar:calendar1];
        [components1 setYear:2065];
        [components1 setMonth:11];
        [components1 setDay:13];

        NSDate *dateFuturoCompleted = [calendar1 dateFromComponents:components1];




        NSDateComponents *date1Components = [calendar components:comps
                                                        fromDate: today];
        NSDateComponents *date2Components = [calendar components:comps
                                                        fromDate: date];
        NSDateComponents *date3Components = [calendar components:comps
                                                        fromDate: dateFuturoSomeday];
        NSDateComponents *date4Components = [calendar components:comps
                                                        fromDate: dateFuturoCompleted];


        today = [calendar dateFromComponents:date1Components];
        date = [calendar dateFromComponents:date2Components];
        dateFuturoSomeday = [calendar dateFromComponents:date3Components];
        dateFuturoCompleted = [calendar dateFromComponents:date4Components];



        NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit
                                               fromDate:today toDate:date options:0].day;
       // NSString *section;
        if (daysAfterToday < 0) {
            tmp  = @"0";
        } else if (daysAfterToday == 0) {
            tmp = @"1";
        } else if (daysAfterToday > 0 && daysAfterToday < 2) {
            tmp = @"2";
        }
        else if ([self.todoDueDate isEqualToDate:dateFuturoSomeday]){
            tmp = @"4";
        }
        else if ([self.todoDueDate isEqualToDate:dateFuturoCompleted]){
            tmp = @"5";
        }
        else {
            tmp = @"3";
        }






        [self setPrimitiveValue:tmp forKey:@"sectionIdentifier"];

    }


    return tmp;

}

我可以做些什么来达到理想的行为?这意味着,当用户在午夜使用应用程序时,项目应自动传递到预期的部分。

谢谢。

1 个答案:

答案 0 :(得分:1)

结帐UILocalNotification

虽然专为......井,本地通知而设计,但您可以轻松地使用通知触发作为刷新已提取数据的排序的方法。

建议:

  • applicationDidBecomeActive - 安排当晚午夜的UILocaleNotification(可选择将其设置为每天重复...以防有人将其打开> 24小时!)
  • applicationDidEnterBackground - 使通知无效
  • 为了处理通知,this post(虽然旧)对如何设置UILocationNotification并处理它从应用代理处理它有一个很好的概述。在您的情况下,只需强制排序更新。