在我的应用程序中,我需要遍历核心数据中的所有实体,并且正在使用NSFetchedresultcontroller。
我现在正在这样做:
NSArray *tempArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects];
for (MyClass *item in tempArray)
{
// do something
}
[tempArray release]; tempArray = nil;
还有没有创建tempArray的更好方法吗?
非常感谢
最佳答案
取决于您要做什么。如果您只是更改一个值,那么可以,有一种更简单的方法:
[[[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个对象就会命中磁盘。只有在确认内存是问题之后,才应使用此功能。
关于iphone - 如何循环通过nsfetchedresultscontroller,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3512872/