在我的应用程序中,我需要循环遍历Core Data中的所有实体,并且我正在使用NSFetchedresultcontroller。
我现在这样做:
NSArray *tempArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects];
for (MyClass *item in tempArray)
{
// do something
}
[tempArray release]; tempArray = nil;
在没有创建tempArray的情况下,有没有更好的方法呢?
非常感谢
答案 0 :(得分:11)
取决于你想做什么。如果你只是改变一个值然后是,那么有一种更简单的方法:
[[[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个对象后你就会遇到磁盘。只有在确认内存成为问题后才能使用此功能。
答案 1 :(得分:6)
对不起,我认为答案很明显:
for (MyClass *item in self.fetchedResultsController.fetchedObjects)
{
//do something
}
这是一种以记忆方式做事的好方法吗?