UITableView部分标题导致表视图缓慢

时间:2012-01-15 22:08:45

标签: ios uitableview core-data nsfetchedresultscontroller

我有UITableView使用NSFetchedResultsController从Core Data加载实体。获取请求当前正在使用批量大小来控制内存开销,因为从fetch返回大约1000行。在挂起所有这些之后,表格视图非常快。

我现在的问题来自于我想在表格视图中添加分组和章节标题。我已经实现了所需的委托方法,但似乎在加载时的fetch中为每个可能的部分调用tableView:titleForHeaderInSection:。我按日期分组,因此整个表视图中大约有700个部分。正如您可能猜到的那样,这会降低视图控制器的初始负载,因为它必须通过所有批次来获取我的部分标题。我期待这个方法被调用,就像加载表视图单元格的方法一样 - 当你滚动表格时。

是否有更好的方法来加载章节标题,或者更好的是,有没有办法将部分标题的加载推迟到用户滚动时使用实际的表格单元格?

有些注意事项:

  • am 使用dateOfFlight方法告知获取请求故障前setPropertiesToFetch:
  • 获取请求的批量限制为25。
  • 获取请求没有提取限制。
  • 我不需要部分索引标题。对于sectionIndexTitlesForTableView:,我将返回Nil;
  • 从fetch中返回大约1000个实体,因为我们按本地化日期进行分组,所以大约有700个部分。

对于它的价值,这里是我用来加载章节标题的代码:

/**
 * We override this method from the base class because we need to format the date
 * prior to it being displayed in the UITableViewSection.
 * @author Jesse Bunch
 **/
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    Flight *cellEntity = (Flight *)[[sectionInfo objects] objectAtIndex:0];

    if (cellEntity) {
        return [cellEntity.dateOfFlight localizedLongDateString];
    }

    return L(@"Unknown Date");

}

-

修改

通过从部分名称而不是实体本身格式化日期,我确实获得了更快的速度:

/**
 * We override this method from the base class because we need to format the date
 * prior to it being displayed in the UITableViewSection.
 * @author Jesse Bunch
 **/
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    static NSDateFormatter *dateFormatter;
    if(nil == dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss ZZ";
    }

    id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    NSDate *sectionDate = [dateFormatter dateFromString:sectionInfo.name];  

    if (sectionDate) {
        return [sectionDate localizedLongDateString];
    }

    return L(@"Unknown Date");

}

1 个答案:

答案 0 :(得分:0)

您是否考虑过以递增方式加载和显示数据?

我的意思是:你加载一堆数据并显示N行(N <&lt; <1000);如果用户向下滚过最后一行,则会加载更多数据并显示更多行(以及更多部分)。

我不确定这种方法是否可以解决您的问题(很可能在经过多次拉动后,视图变慢了)但我认为您可以尝试一下......可能,用户体验也会从中受益(除了缓慢)。

如果您有兴趣,可以查看EGOTableViewPullRefresh,它实现了“下拉重装”的类似机制。这对于检测最后一行的滚动非常有用。