2016-05-07 1 views
0

J'ai un productImageArray qui contient l'URL en tant qu'éléments du tableau. J'essaye de charger ces URLs dans ma vue d'image.Chargement d'une image du service Web sur un UIImage ne fonctionne pas correctement

Voici comment je la charge.

UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
     spinner.center=CGPointMake(160.0,240.0); 
     spinner.hidesWhenStopped=YES; 
     [self.view addSubview:spinner]; 
     [spinner startAnimating]; 

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); 
     dispatch_async(queue, ^{ 
      NSData *storeImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:productImageArray[indexPath.row]]]; 
      self.productImage.image = [UIImage imageWithData:storeImageData]; 
      dispatch_sync(dispatch_get_main_queue(), ^{ 

       [spinner stopAnimating]; 
      }); 
     }); 

Le problème est que,

  1. Seule la dernière cellule de mon tableview charge l'image alors que la cellule restante ne charge pas l'image de l'url
  2. est-il une autre meilleure façon de charger l'image de l'url directement dans mon UIImage en utilisant des méthodes natives?

Lorsque j'utilise le code suivant, chaque cellule de mon tableview charge les données d'image mais il gèle l'interface utilisateur jusqu'à ce que les données sont chargées complètement

NSData *storeImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:productImageArray[indexPath.row]]]; 

     self.productImage.image = [UIImage imageWithData:storeImageData]; 
+1

Mettez 'self.productImage.image = [UIImage imageWithData: storeImageData];' dans la file d'attente principale. –

+0

si vous utilisez le service Web AFNetworking? –

+0

Non im ne pas utiliser afnetworking – Roger

Répondre

1

essayer

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); 
    dispatch_async(queue, ^{ 
     NSData *storeImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:productImageArray[indexPath.row]]]; 

     dispatch_sync(dispatch_get_main_queue(), ^{ 

      [spinner stopAnimating]; 
       self.productImage.image = [UIImage imageWithData:storeImageData]; 
     }); 
    }); 

ou essayez comme

self.productImage.image = nil; //// [UIImage imageNamed:@"default.png"]; 

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:productImageArray[indexPath.row]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    if (data) { 
     UIImage *currentImage = [UIImage imageWithData:data]; 
     if (currentImage) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       UITableviewCell *getCurrentCell = (id)[tableView cellForRowAtIndexPath:indexPath]; 
       if (getCurrentCell) 
        self.productImage.image = currentImage; 
      }); 
     } 
    } 
}]; 
[task resume]; 
+0

oui je l'ai essayé mais toujours la première cellule n'a pas chargé l'image et son encore 0ty – Roger

+0

@KaruppuMGR - vérifier la réponse mise à jour bro une fois –

+0

je l'ai essayé, mais il en résulte la duplication des cellules et aussi peu les cellules restent déchargées. – Roger

2

@ Anbu.Karthik réponse est correct. Mais, peut-être la solution la plus simple est d'utiliser quelque chose comme SDWebImage non? Cette librairie gérera ce problème et bien plus encore (cache, gestion des erreurs, gestion correcte des cellules tableview, ...).

Je pense que vous devriez, au moins, prenez quelques minutes pour regarder: https://github.com/rs/SDWebImage

Edit:

Si vous utilisez SDWebImage et UIActivityIndicator-for-SDWebImage, vous pouvez remplacer votre code entier par cette :

[self.productImage setImageWithURL:[NSURL URLWithString:productImageArray[indexPath.row]] 
         usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

Plus d'informations sur: UIActivityIndicator-for-SDWebImagehttps://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage

+0

, si vous voulez un ansewer plus facile, utilisez une réponse, SDWebImage est bon pour cache –

+0

bon frère ........, ajouter un échantillon, il est facile de travailler –

+0

J'ai ajouté un exemple qui correspond complètement au code original. –

0
NSString *url_Img1 = @"Your url"; 
    Uiimageview *view_Image.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url_Img1]]]; 
+0

yup mais il faut du temps pour le charger et donc l'interface utilisateur entière est gelée – Roger

+0

Je ne pense pas que ce soit une bonne solution. En effet, vous chargez l'image dans le fil principal. Ainsi, l'interface utilisateur sera complètement gelée pendant tout le processus de téléchargement. –

+0

Vous pouvez faire comme cela en utilisant sd_webimage [imgprofile sd_setImageWithURL: [NSURL URLWithString: [NSString stringWithFormat: @ "% @", [[[ResponseFriendList valueForKey: @ "données"] objetAtIndex: indexPath.row] valeurForKey: @ "profil_pic"] ]] placeholderImage: [UIImage imageNamed: @ "avatar.png"]]; –