2010-08-18 35 views
5

trong ứng dụng của tôi, tôi cần lặp qua tất cả các thực thể của tôi trong Core Data và tôi đang sử dụng NSFetchedresultcontroller.làm thế nào để lặp qua nsfetchedresultcontroller

tôi đang làm nó như thế này vào lúc này:

NSArray *tempArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects]; 

for (MyClass *item in tempArray) 
{ 
    // do something 
} 

[tempArray release]; tempArray = nil; 

Có cách nào tốt hơn để làm điều đó mà không cần tạo các tempArray?

Thanks a lot

Trả lời

11

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 đề.

6

Xin lỗi, tôi nghĩ câu trả lời rất rõ ràng:

 for (MyClass *item in self.fetchedResultsController.fetchedObjects) 
     { 
      //do something 
     } 

có phải là một cách tốt để làm điều đó bộ nhớ khôn ngoan?

Các vấn đề liên quan