我正在开发一个应用程序,它需要通过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概念的新手,并通过开发人员指南阅读了核心数据概念,但我没有找到任何与内存处理相关的信息。请帮我。
答案 0 :(得分:1)
我希望你使用ARC?因为你没有释放任何初始化的物体。 (如果不是这是你的答案。)
但无论如何:你是否尝试使用Instruments来查看哪些对象最多会增加内存占用?那将是一个很好的起点。
答案 1 :(得分:0)
shiva inturi,
首先,我想回应其他评论,即使用一百万个项目的单个表格视图实际上是一个糟糕的用户体验。
问题:
内存警告到来时你在做什么?
至少,您应该浏览对象数组并修剪对象图。这是通过-refreshObject:mergeChanges:
完成的。你也应该注意不要远远地遍历你的阵列。我会从您的可见对象开始,然后向后和向前工作,直到您开始遇到故障对象,方法是使用-isFault
进行测试。
安德鲁