私はUITableView
を持っています。 tableView:cellForRow:atIndexPath:
のメソッド(データがセルに読み込まれるとき)では、何らかの遅延読み込みを実装しました。 rowData
NSDictionary
にキーのオブジェクトがない場合(キー==行番号)、プログラムはバックグラウンドでrequestDataForRow:
メソッドを起動します。セル内のデータは、セルが表示された後に少しポピュレートされます。私のテーブルは2000行を持っており、指標10を持つセルからユーザーがスクロールは非常に迅速にインデックス2000でセルにいる場合このコードは動作しますが、すべてが、OKですUITableView遅延ロード最適化
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];
};
しかし:ここ のコードです。すべてのデータ要求が完了するまで(11,12,13、...、2000行)、ユーザーがテーブルビューをスクロールしている間に行が表示され、メソッドrequestDataForRow
が呼び出されるまで、長い時間待たなければなりません。
これらのものを最適化するにはどうすればよいですか?
ここでは、いくつかの非常に良いソリューション(コード付き)で同じ問題が発生した場合の素晴らしい質問があります:http://stackoverflow.com/q/7567827/937822 – lnafziger