UITableView延迟加载优化

use*_*666 6 iphone lazy-loading objective-c uitableview ipad

我有UITableView.在tableView:cellForRow:atIndexPath:方法中(当数据填充到单元格时)我实现了某种延迟加载.如果在后台rowData NSDictionary程序启动requestDataForRow:方法中没有键(键==行号)的对象.因此,在单元格变为可见之后,单元格中的数据会被填充一点.这是代码:

static int requestCounter=0;

-(void)requestDataForRow:(NSNumber *)rowIndex
{
    requestCounter++;
    //NSLog(@"requestDataForRow: %i", [rowIndex intValue]);
    PipeListHeavyCellData *cellData=[Database pipeListHeavyCellDataWithJobID:self.jobID andDatabaseIndex:rowIndex];
    [rowData setObject:cellData forKey:[NSString stringWithFormat:@"%i", [rowIndex intValue]]];
    requestCounter--;

    NSLog(@"cellData.number: %@", cellData.number);

    if (requestCounter==0)
    {
        //NSLog(@"reloading pipe table view...");
        [self.pipeTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
    };
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"pipeCellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    [[NSBundle mainBundle] loadNibNamed:@"PipesForJobCell" owner:self options:nil];
    cell = pipeCell;
    self.pipeCell = nil;


    PipeListHeavyCellData *cellData=[[PipeListHeavyCellData alloc] init];

    if ([rowData objectForKey:[NSString stringWithFormat:@"%i", indexPath.row]]==nil)
    {
        //NSLog(@"        nil data for row: %i", indexPath.row);
        [self performSelectorInBackground:@selector(requestDataForRow:) withObject:[NSNumber numberWithInt:indexPath.row]];
    }
    else
    {
        //NSLog(@"        has data for row: %i", indexPath.row);
        PipeListHeavyCellData *heavyData=[[PipeListHeavyCellData alloc] init];
        heavyData=(PipeListHeavyCellData *)[rowData objectForKey:[NSString stringWithFormat:@"%i", indexPath.row]];
        cellData._id=[heavyData._id copy];
        cellData.number=[heavyData.number copy];
        cellData.status=[heavyData.status copy];
};
Run Code Online (Sandbox Code Playgroud)

这段代码有效,一切正常,我的表有2000行,如果用户从索引10的单元格滚动到索引2000的单元格很快.他必须等待很长时间才能完成所有拉取数据请求(对于行11,12,13,...,2000)导致在用户滚动表视图时行变为可见,因此requestDataForRow为它们调用了方法.

我怎样才能优化这些东西?

Bra*_*rke 4

我不得不做类似的事情。您需要创建一个队列,首先处理最近添加的项目。

例如,用户打开表,有 10 个请求排队。您将第一个对象出队并开始获取第一行的数据。然而,用户随后向下滚动到第 31-40 行。然后,您必须将这些行插入队列中的前 10 行之前,因为它们现在具有更高的优先级。关键是你不会立即立即启动 10 个请求,而是按顺序处理它们。这样,当用户滚动时,您只会“浪费”一个请求 - 发出的最后一个请求。

实际实现这一点的一个简单方法是使用[tableView indexPathsForVisibleRows].