Téléchargez datatables d'abord, puis affichez-les sur TableViewcontroller

J'ai tableviewcontroller et des données fecthed du server. J'utilise la class suivante pour download datatables asyn. mais mon problème est le chargement des données lorsque l'user voit le tableViewcontroller. Je veux que datatables soient chargées avant que l'user ne voit.

#import <SDWebImage/UIImageView+WebCache.h> - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell.textLabel.text = [[tableData objectAtIndex:indexPath.row] valueForKey:@"name"]; cell.textLabel.font = [UIFont fontWithName:@"BebasNeue" size:24]; cell.textLabel.textColor = [UIColor whiteColor]; NSSsortingng *imageURLSsortingng=[[tableData objectAtIndex:indexPath.row] valueForKey:@"logo"]; NSSsortingng* imageURL = [[tableData objectAtIndex:indexPath.row] valueForKey:@"picture"]; [cell.imageView setImageWithURL:[NSURL URLWithSsortingng:imageURL]]; } 

Solution

Avec SDWebImage, vous pouvez download l'image en premier.

Où?

Cela dépend de votre implémentation. Peut-être dans un précédent controller, ou dans votre appDelegate . Si la tableview apparaît dans votre viewcontroller initial, les chances sont de dépendre absolument de la vitesse du réseau.

Exemple de code

Jetez un oeil à ce code ( extrait du file Readme de la bibliothèque, vérifiez la source !):

 Manager *manager = [SDWebImageManager sharedManager]; [manager downloadWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // YOU DON'T NEED THIS } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { if (image) { // MAYBE YOU WANT TO DO SOMETHING HERE } }]; 

Ensuite, dans votre tableView:cellForRowAtIndexPath: vous pouvez juste définir l'image comme ceci:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // ... NSURL* url = GET_IMAGE_URL; [cell.imageView setImageWithURL:url]; // ... } 

Comment ça marche?

La bibliothèque prend soin de regarder d'abord dans son cache, où elle finda l'image précédemment téléchargée, car elle utilise les URL de l'image comme keys pour le cache, de sorte que l'image apparaisse immédiatement.

Problème

Vous téléchargez des données et les chargez sur tableView async, ce qui signifie que votre process de données s'exécute en arrière-plan, mais que la tableView est toujours active et qu'elle est affichée.

Ma solution

Je gère cette situation de deux façons

  1. Vous devez d'abord charger toutes datatables dans un NSArray ou NSDictionary (quel que soit l'object dont vous avez besoin) avant de présenter votre TableViewController , et le passer en tant qu'argument à TableViewController . En d'autres termes, vous devez charger des données avant de présenter le tableViewController .

  2. Vous devez créer une vue d'animation, ou une vue de chargement pendant que vous effectuez le téléchargement des données que vous dites à l'user que datatables sont en cours de chargement, donc attendez que le process soit terminé. Et lorsque le process est terminé, rechargez simplement la tableView et passez datatables aux TableViewCells .

Exemple

1) Ce code est utilisé lorsque vous envoyez une requête au server pour get des données (par exemple à partir de JSON)

 LoadingView *spinn = [LoadingView loadSpinnerIntoView:self.view]; dispatch_queue_t downloadQueue = dispatch_queue_create("LoadingView", NULL); dispatch_async(downloadQueue, ^{ // do our long running process here [NSThread sleepForTimeInterval:0.1]; // do any UI stuff on the main UI thread dispatch_async(dispatch_get_main_queue(), ^{ //Start downloading your data, and pass data you fetched to objects of NSDictionary //Your methods //After downloading data is done, reload data on tableView [tableView reloadData]; //Remove loading view, and your tableViewController is all set [spinn removeSpinner]; });}); 

2) Après avoir NSDictionary données dans NSDictionary ou NSArray partir de la requête que vous avez faite, vous avez également des liens pour download des images.

Pour download l'image async sans bloquer MainThread, vous pouvez vous référer à la question @sonxurxo, ou vous pouvez utiliser celle-ci qui utilise aussi SDWebImage

Vous avez juste besoin d' #import <SDWebImage/UIImageView+WebCache.h> dans votre projet, et vous pouvez également définir l'espace réservé lorsque l'image est téléchargée avec juste ce code:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSSsortingng *MyIdentifier = @"MyIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; } // Here we use the new provided setImageWithURL: method to load the web image [cell.imageView setImageWithURL:[NSURL URLWithSsortingng:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; cell.textLabel.text = @"My Text"; return cell; }