取決於你想要做什麼。如果你只是改變一個值,那麼是的,有一個更簡單的方法:
[[[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個物體後都會碰到磁盤。這應該只有在你有確認內存是一個問題後才能使用。