Оптимизация отложенной загрузки UITableView

у меня есть UITableView. в методе tableView:cellForRow:atIndexPath:(когда данные заполняются ячейками) я реализовал какую-то ленивую загрузку. Если нет объекта для ключа (ключ == номер строки) в rowDataNSDictionary, программа запускает метод 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];
};

Этот код работает, все в порядке, НОв моей таблице 2000 строк и если пользователи очень быстро прокручивают от ячейки с индексом 10 до ячейки с индексом 2000. Он должен долго ждать, пока все запросы на извлечение данных будут завершены (для строк 11, 12, 13, ..., 2000), потому что строки стали видны, пока пользователь прокручивал представление таблицы, поэтому метод requestDataForRowк ним призывали.

Как я могу оптимизировать эти вещи?

6
задан user1385666 15 May 2012 в 14:49
поделиться