在CoreData的fetchedObjects中编辑多个对象

时间:2014-02-18 15:55:27

标签: ios objective-c core-data nsarray magicalrecord

很简单,我想迭代CoreData的[self.fetchedResultsController fetchedObjects](更具体地说,我在本例中使用的是MagicalRecord)并更改符合我标准的所有项(if语句),然后对这些对象进行更改。

for (Task *aTask in [[self.fetchedResultsController fetchedObjects] mutableCopy]) {
    if ([aTask.day past] && [[aTask isArchived] isEqual:@(NO)]) {

        NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
        [context MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {
            aTask.day = date;
        }];
    }
}

但事实证明它不起作用!我正在尝试一个解决方案,我不必手动管理Core answer所指定的所有内容,而是找到问题的简洁解决方案,几行代码而不是多次迭代。

编辑:根据Dan的回答,我编辑了我的不完美代码......

NSPredicate *uncompletedTasks = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"day < %@ AND isArchived = %@",[NSDate date],@NO]]];
self.fetchedResultsController = [Task MR_fetchAllSortedBy:@"dateScheduled" ascending:YES withPredicate:uncompletedTasks groupBy:nil delegate:self inContext:[NSManagedObjectContext MR_defaultContext]];

for (Task *aTask in [self.fetchedResultsController fetchedObjects]) {
    aTask.day = date;
}

NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
[context MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {}];

这解决了这个问题,虽然只是在我更新视图的时候,我得到了这个错误:

  

CoreData:错误:严重的应用程序错误。抓住了例外   在核心数据更改处理期间。这通常是一个bug   NSManagedObjectContextObjectsDidChangeNotification的观察者。 ***    - [__ NSPlaceholderDictionary initWithObjects:forKeys:count:]:尝试使用userInfo(null)从对象1插入nil对象

2 个答案:

答案 0 :(得分:1)

我对MagicalRecord一无所知,但......

如果您遍历FRC提取的所有项目,只是为了更新其中一些项目,您最好:

1)在后台执行更新
2)仅获取需要更新的对象。示例谓词:

NSPredicate* needUpdate = [NSPredicate predicateWithFormat:@"day < %@ AND isArchived = %@",[NSDate date],@NO];
NSPredicate* p = [NSCompoundPredicate andPredicateWithSubpredicates:@[FRC_predicate,needUpdate]];

3。更新所有对象后(或批量,不要逐个保存)执行单个保存

猜猜...... 您编写的代码可以在完成块中更新对象(aTask.day = date;) 实际上,这可能不会像您认为的那样持续改变 在调用“保存”程序之前进行更新。

答案 1 :(得分:0)

这里有几个问题。

首先,我不确定你为什么需要mutableCopy。你没有修改你正在迭代的数组成员,所以这不是必需的。我甚至不确定在这种情况下制作托管对象副本的效果如何。把它留下来吧。

其次,您的布尔比较有点令人困惑,可以用更简单的方式编写。这应该足够了:

"... && aTalk.isArchived.boolValue"

第三,您在保存后更改完成块中的对象。所以你没有保存这个改变,也许是前一个迭代通过循环所做的改变。相反,只需编写更改并在循环后调用save。

保存时,请确保使用的上下文与获取的结果控制器的上下文相同。