Phụ thuộc vào những gì bạn muốn làm. Nếu bạn chỉ thay đổi một giá trị thì có, có một cách dễ dàng hơn:
[[[self fetchedResultsController] fetchedObjects] setValue:someValue forKey:@"someKey"]
đó sẽ lặp qua tất cả các đối tượng thiết lập các giá trị. Đây là một hoạt động KVC tiêu chuẩn. Lưu ý rằng điều này sẽ mở rộng bộ nhớ vì mỗi thực thể sẽ nhận được trong quá trình đột biến.
Nếu bạn cần làm điều gì đó liên quan nhiều hơn đến từng thực thể hoặc bạn đang gặp phải vấn đề về bộ nhớ thì mọi thứ trở nên phức tạp hơn một chút. LƯU Ý: Đừng lo lắng về bộ nhớ cho đến khi giai đoạn tối ưu hóa mã hóa. Pre-tối ưu hóa các vấn đề bộ nhớ, đặc biệt là với Core Data, là một sự lãng phí thời gian của bạn.
Khái niệm là bạn sẽ lặp qua từng thực thể và thay đổi nó khi cần. Ngoài ra, tại một thời điểm nhất định, bạn nên lưu ngữ cảnh, đặt lại nó và sau đó thoát khỏi một nhóm tự động trả lời cục bộ. Điều này sẽ làm giảm sử dụng bộ nhớ của bạn như bạn sẽ đẩy các đối tượng bạn chỉ cần thao tác lại ra khỏi bộ nhớ trước khi bạn kéo các đợt tiếp theo trong Ví dụ:.
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;
này sẽ giữ cho việc sử dụng bộ nhớ xuống nhưng nó là đắt! ! Bạn đang nhấn đĩa sau mỗi 100 đối tượng. Điều này chỉ nên được sử dụng sau khi bạn có xác nhận rằng bộ nhớ là một vấn đề.
Nguồn
2010-08-18 19:44:33