取决于你想要做什么。如果你只是改变一个值,那么是的,有一个更简单的方法:
[[[self fetchedResultsController] fetchedObjects] setValue:someValue forKey:@"someKey"]
这将循环所有的对象设置值。这是标准的KVC操作。请注意,这将扩大记忆,因为每个实体都将在突变期间实现。
如果您需要对每个实体做更多的事情,或者您遇到内存问题,那么事情会变得更加复杂。注意:不要担心内存,直到编码的优化阶段。对内存问题进行预优化,特别是对于Core Data,这是浪费您的时间。
这个概念是,你将遍历每个实体并根据需要进行更改。另外,在某个点你应该保存上下文,重置它,然后排空一个本地自动释放池。这将减少你的内存使用量,同时拉动下一批之前,你会推你只是操纵背出内存中的对象,例如:
NSManagedObjectContext *moc = ...;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSInteger drainCounter = 0;
for (id object in [[self fetchedResultsController] fetchedObjects]) {
//Do your magic here
++drainCounter;
if (drainCounter = 100) {
BOOL success = [moc save:&error];
NSError *error = nil;
NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]);
[moc reset];
[pool drain], pool = nil;
pool = [[NSAutoreleasePool alloc] init];
drainCounter = 0;
}
}
BOOL success = [moc save:&error];
NSError *error = nil;
NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]);
[pool drain], pool = nil;
这将让内存的使用下来,但它是贵! !您每100个物体后都会碰到磁盘。这应该只有在你有确认内存是一个问题后才能使用。