很简单,我想迭代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对象
答案 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。
保存时,请确保使用的上下文与获取的结果控制器的上下文相同。