iOS TableView非常缓慢地加载数据

时间:2012-10-16 13:32:24

标签: iphone ios ios5 ios6

我正在开发一个解析来自Web服务的数据并在表格视图中显示的项目。一切都很好,但我对tableview的表现不满意。在从Web解析数据后,我调用了重新加载数据来显示数据,但它没有立即显示单元格。它在10/15秒后显示数据。在调用重载数据之前,我已经检查了所有数据的加载。奇怪的是,如果我试图拖动桌子,它会立即显示细胞。

有什么想法吗?

更新

-(void)receivedCategories:(NSMutableArray *)categoryItems{
  [self.spinner stopAnimating];
  self.categories=categoryItems;
  if (self.tableView!=nil) {
    [self.tableView reloadData];
  }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return [self.categories count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"CategoryCell";
  CategoryCell    *cell           = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  cell.category                   = [self.categories objectAtIndex:indexPath.row];
  return cell;
}

CategoryCell.m

@implementation CategoryCell

- (void)setCategory:(Category *)category
{
  [self.categoryTitle setText:category.title ];
  [self.categorySubTitle setText:category.description];
}

@end

5 个答案:

答案 0 :(得分:24)

您似乎没有从主线程调用[self.tableView reloadData];,这可能是您遇到问题的原因。

你可以尝试:

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];

另请查看accepted answer here以获取更多信息。

答案 1 :(得分:1)

我有同样的问题,[tableview reloaddata]和调用方法[cellForRowAtIndexPath]的app之间的时间间隔太长(几秒钟)。将[reloaddata]方法放在<SlidingTabLayout ... android:background="@color/tabBgColor" /> 中解决了这个问题。

答案 2 :(得分:1)

您使用的是自定义字体吗?

我有一个非常类似的问题,我的UITableView需要相当长的时间来加载。我终于找到了解决方案,它与我的代码或我加载自定义单元格的方式没有任何关系。

问题发生在运行时,当系统从故事板加载我的自定义UITableViewCells(带有预定义的自定义字体)时,并且因为未正确安装的自定义字体,系统会遍布整个地方查找字体文件,加载文件时造成相当大的延迟。

确保您的字体已正确安装:

  1. 在XCode项目中包含您的字体
  2. 确保它们已包含在目标
  3. 仔细检查您的字体是否包含在捆绑包中的资源
  4. 在您的应用程序plist中包含您的iOS自定义字体
  5. 找到字体的名称(要找出正确的名称,可以打印所有已安装的字体)

    for (NSString* family in [UIFont familyNames]){
    
        NSLog(@"Family %@", family);
    
        for (NSString* name in [UIFont fontNamesForFamilyName: family]){
    
            NSLog(@"\t Font%@", name);
        }
    }
    
  6. 使用UIFont并指定字体名称

    [UIFont fontWithName:@"FONT_NAME" size:size];
    

答案 3 :(得分:0)

根据您显示的代码量(无),我不得不说您遇到的性能损失是因为您使用大量记录调用reloadData,或者因为您正在花费一些时间来解析/创建单元格时的计算。此外,如果要在这些单元格上显示图像,则可能还会导致性能问题。

答案 4 :(得分:-1)

创建CategoryCell时?在第一次dequeueReusableCell将返回零。然后制作分类单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"CategoryCell";
  CategoryCell    *cell           = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (!cell) {
    cell = [[[CategoryCell alloc] init] autorelease];   }

  cell.category                   = [self.categories objectAtIndex:indexPath.row];
  return cell;
}