如何循环通过nsfetchedresultcontroller

Bur*_*jua 5 iphone core-data nsfetchedresultscontroller

在我的应用程序中,我需要循环遍历Core Data中的所有实体,并且我正在使用NSFetchedresultcontroller.

我现在这样做:

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

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

[tempArray release]; tempArray = nil;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来创建tempArray?

非常感谢

Mar*_*rra 11

取决于你想做什么.如果你只是改变一个值然后是,有一个更简单的方法:

[[[self fetchedResultsController] fetchedObjects] setValue:someValue forKey:@"someKey"]
Run Code Online (Sandbox Code Playgroud)

哪个会遍历设置值的所有对象.这是标准的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;
Run Code Online (Sandbox Code Playgroud)

这会降低内存使用量,但价格昂贵!! 每100个对象后你就会遇到磁盘.只有在确认内存有问题后才能使用此选项.


Bur*_*jua 6

对不起,我认为答案显而易见:

        for (MyClass *item in self.fetchedResultsController.fetchedObjects)
        {
            //do something
        }
Run Code Online (Sandbox Code Playgroud)

这是一个记忆明智的好方法吗?