UITableView
var. tableView:cellForRow:atIndexPath:
yönteminde (veriler hücrelere girdiğinde) bir çeşit tembel yükleme uygulamamıştım. rowData
NSDictionary
programında anahtar (key == sıra numarası) için herhangi bir nesne yoksa arka planda requestDataForRow:
yöntemini başlatır. Böylece hücrelerdeki veriler, hücre görünür hale geldikten sonra biraz doldurulur.UITableView tembel yükleme optimizasyonu
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];
};
, her şey , Tamam AMA endeksi 10 ile hücreden kullanıcıların kaydırır çok hızlı endeksi 2000 ile Hücre Eğer benim tablo 2000 satır var ve: İşte kod. Tüm çeken veri istekleri tamamlanana kadar uzun bir süre beklemeli (satır 11, 12, 13, ..., 2000 için), kullanıcı tablo görünümünde gezinirken satırların görünür hale gelmesine neden oldu, böylece requestDataForRow
yöntemi onlara çağrıldı.
Bu şeyleri nasıl en iyi duruma getirebilirim?
İşte aynı sorun ile çok iyi bir çözüm (kod ile) ile aynı sorun için harika bir soru: http://stackoverflow.com/q/7567827/937822 – lnafziger