2012-05-15 21 views
6

UITableView var. tableView:cellForRow:atIndexPath: yönteminde (veriler hücrelere girdiğinde) bir çeşit tembel yükleme uygulamamıştım. rowDataNSDictionary 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

Bu kod çalışır
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?

+1

İş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

cevap

4

Benzer bir şey yapmak zorundaydım. İlk olarak en son eklenen öğeleri işleyen bir kuyruk oluşturmanız gerekir.

Örneğin, kullanıcı tablosunu açar ve 10 istekler sıraya konulur. İlk nesneyi deşifre edin ve ilk satırın verilerini getirmeye başlayın. Ancak, kullanıcı daha sonra 31-40 satırlarına kaydırır. Ardından sıradaki ilk 10'dan önce bu satırları eklemeniz gerekir, çünkü artık daha yüksek önceliğe sahipler. Anahtar, bir kerede 10 isteğin hemen başlatılmaması, ancak bunları sırayla işlememenizdir. Böylelikle, kullanıcı kaydırdığında, yalnızca bir isteği "harcayacaksınız" - yapılan son istek.

Gerçekte bunu uygulamak için kolay bir yol, [tableView indexPathsForVisibleRows] kullanmaktır.

+0

Teşekkürler, benim düşüncelerim benzer. – user1385666

İlgili konular