UITableView在iphone中有大量(可能是1百万条目)的数据

时间:2012-03-05 14:56:13

标签: iphone objective-c uitableview core-data

我正在开发一个应用程序,它需要通过tableview中的无限滚动来加载超过100万个条目。每次请求将被发送1000个条目,一旦数据被下载并通过JSON库解析,该表就会被重新加载。我已经通过CoreData实现了这个“setFetchBatchSize = 1000”。

StreamModal *modal = [[StreamModal alloc]init];
              StreamModal *modal = [NSEntityDescription insertNewObjectForEntityForName:@"StreamModal" inManagedObjectContext:managedObjectContext];
                 if([self isNotNull:[streamDataDict objectForKey:@"_id"]])
                     modal.stream_id               = [streamDataDict objectForKey:@"_id"];

-(void)reloaData{
@try {
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }
    NSLog(@"ferchresults count %d",[[_fetchedResultsController fetchedObjects]count]);
}
@catch (NSException *exception) {
    NSLog(@"exception raised in reloadData in streamViewController class %@",exception);
}
@finally {

}
}


- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"StreamModal" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:1000];
//[fetchRequest setFetchLimit:2000];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

fetchRequest = nil;
theFetchedResultsController = nil;

return _fetchedResultsController;    

}

这是我正在使用的代码,当连接完成加载数据时,我将数据填充到NSManagedObject类(StreamModal)然后调用重载数据。问题是应用程序在表中加载12000个条目后得到内存异常坠毁了。如何在没有内存异常的情况下加载所有条目。我是CoreData概念的新手,并通过开发人员指南阅读了核心数据概念,但我没有找到任何与内存处理相关的信息。请帮我。

2 个答案:

答案 0 :(得分:1)

我希望你使用ARC?因为你没有释放任何初始化的物体。 (如果不是这是你的答案。)

但无论如何:你是否尝试使用Instruments来查看哪些对象最多会增加内存占用?那将是一个很好的起点。

答案 1 :(得分:0)

shiva inturi,

首先,我想回应其他评论,即使用一百万个项目的单个表格视图实际上是一个糟糕的用户体验。

问题:

内存警告到来时你在做什么?

至少,您应该浏览对象数组并修剪对象图。这是通过-refreshObject:mergeChanges:完成的。你也应该注意不要远远地遍历你的阵列。我会从您的可见对象开始,然后向后和向前工作,直到您开始遇到故障对象,方法是使用-isFault进行测试。

安德鲁