NSPredicate predicateWithFormat:仍在计算以前删除的数据

时间:2013-11-10 18:51:12

标签: ios core-data xcode5 nspredicate predicatewithformat

我正在显示一系列活动的任务。为了实现这一点,我使用NSPredicate predicateWithFormat:来选择列表中的项目。但我遇到的问题是关于该列表以前删除的任务。即使它们没有显示(或者我应该说显示为无效),它们仍然被计算在内。

所以我的问题是:我怎样才能选择仍属于列表的项目(任务)?应省略删除的数据。它们应该完全被删除。

我的部分代码(我刚刚在Martin的评论后更新了它):

- (void)continueAutomaticModeWithList:(DIDList *)list taskIndex:(NSInteger)index {
if (index == list.tasks.count) return;
DIDTask *task = [DIDTask MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"list == %@ && index == %@", list, @(index)]];

if (task.completedValue) {
    [self continueAutomaticModeWithList:list taskIndex:index + 1];
    return;
}

[UIAlertView showAlertViewWithTitle:@"Task" message:task.name cancelButtonTitle:@"Stop" otherButtonTitles:@[@"Click to go to next action", @"Click to go to next action and notify user"] handler:^(UIAlertView *alertView, NSInteger buttonIndex) {
    if (buttonIndex > 0) {
        [MagicalRecord saveWithBlock:^(NSManagedObjectContext localContext) {
            [[task MR_inContext:localContext] setCompletedValue:buttonIndex == 1];
        } completion:^(BOOL success, NSError *error) {
            [self.tableView reloadData];
        }];
        [self continueAutomaticModeWithList:list taskIndex:index  1];
    }
}];

}

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题不正确,以下情况应该有效:

- (void)continueAutomaticModeWithList:(DIDList *)list taskIndex:(NSInteger)index {
    if (index == list.tasks.count) return;
    DIDTask *task = [DIDTask MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"list == %@ && index >= %@", list, @(index)]
                                              sortedBy:@"index"
                                             ascending:YES];

    if (task == nil) {
         // No task with given or greater index found.
         return;
    }

    if (task.completedValue) {
        [self continueAutomaticModeWithList:list taskIndex:task.index + 1];
        return;
    }

    // ...
}

不是搜索具有给定索引的对象(可能不再存在), 它搜索至少给定索引的“第一个”对象。