【问题标题】:UITableView with huge(probably 1million entries)data in iphoneUITableView 在 iphone 中有大量(可能有 100 万个条目)数据
【发布时间】:2012-03-05 14:56:12
【问题描述】:

我正在开发一个应用程序,该应用程序需要通过在 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 概念的新手,并且通过开发人员指南阅读了核心数据概念,但我没有找到任何与内存处理相关的信息。请帮我。

【问题讨论】:

  • 用拇指在 iPhone 屏幕上滚动一百万行需要多长时间?这看起来很荒谬。
  • 天啊。谁是客户?我很想认识他/她? 100 万个条目?
  • 据我所知,我可以说最好在每次用户滚动或任何其他事件时下载部分数据,否则设备中的内存是有限的,因此它不会允许加载太多数据一次......
  • 提供索引并向下钻取。 4 英寸屏幕上的单个表格中的数百万行是可笑的。
  • 包裹 NSError 的异常处理程序是怎么回事?

标签: iphone objective-c uitableview core-data


【解决方案1】:

我希望您使用的是 ARC?因为您没有释放任何已初始化的对象。 (如果不是,这就是你的答案。)

但无论如何:你有没有试过用 Instruments 来查看,哪些对象最多增加了内存占用?这将是一个很好的起点。

【讨论】:

  • 谢谢 iaydee3,是的,我已经检查过仪器,当我观察到下载 5000 个条目(每次只有 1000 个)时,实时字节在 15 到 17MB 之间增加,并且随着页数增加内存大小也增加(但每次我只下载 1000 个条目并使用 coredata 保存它们)并且当下载和重新加载表完成时,活动字节回落到 3.0MB。我无法弄清楚为什么活动字节不断增加,我认为这可能是因为重新加载了包含 12000 个条目的表。
【解决方案2】:

湿婆神,

首先,我想回应其他 cmets,即使用包含一百万个项目的单个表视图确实是一种糟糕的用户体验。

你的问题:

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

至少,您应该遍历对象数组并修剪对象图。这是通过-refreshObject:mergeChanges: 完成的。您还应该注意不要将数组遍历太远。我将从您的可见对象开始,并通过使用-isFault 进行测试,来回工作,直到您开始击中故障对象。

安德鲁

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2018-04-11
    相关资源
    最近更新 更多