【问题标题】:NSPredicate predicateWithFormat: still counting previously deleted dataNSPredicate predicateWithFormat: 仍在计算之前删除的数据
【发布时间】:2013-11-22 12:07:18
【问题描述】:

我正在显示活动列表中的几个任务。为此,我使用 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)“它们没有显示/显示为无效”是什么意思?您的问题中没有显示任何内容的代码。 - 2)如何删除任务,“删除的任务仍然计数”是什么意思?您的代码中没有“计数”。 - 3) “index”是“DIDTask”的属性吗?它在哪里设置?您是否假设删除对象时会更新“索引”?
  • Martin,假设我有一个列表名称:“启动您的计算机”,与之相关的任务是 1)“插入计算机”,2)“插入所有外围设备”和 3)“按开始按钮”。如果我希望应用程序选择和显示任务 1)、2) 和 3),我没有任何问题。但是假设我删除了任务 2),然后它会显示为“插入计算机”、“”、“按开始按钮”。我应该只是“插上你的电脑”,“按下开始按钮”。任务 2) 显示为“”,而它甚至不应该存在。
  • 如何在tableview中显示任务?您使用获取的结果控制器吗?如果没有,删除任务时如何更新表格视图?获取请求是什么样的?
  • 它们在警报视图中一一显示。请参阅上面的代码,因为我刚刚更新了它。
  • 删除一个对象不会改变其余对象的index属性。如果您搜索index == 1 并且该对象已被删除,那么您将获得nil,而不是下一个未删除的对象。

标签: ios core-data xcode5 nspredicate predicatewithformat


【解决方案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;
    }

    // ...
}

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

【讨论】:

  • 谢谢它解决了这个问题。但是又出现了一个:最后一个对象被重复了。无论如何,至少我现在知道该往哪里看。
  • @Armand:你可能需要检查MR_findFirstWithPredicate是否返回nil,我已经更新了答案。
  • 它仍然将最后一个对象加倍添加您的更新行。但鉴于第一个问题已解决,答案已接受!现在我正在修复第二个...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
相关资源
最近更新 更多