2015-10-28 4 views
1

Je suis nouveau dans la programmation dans Swift et jusqu'à présent, je télécharge des données JSON sous forme de chaînes et de remplir un UITableView. Les images à l'intérieur sont des liens d'URL. Le problème est que les données sont nombreuses, 53, donc 53 appels d'url pour obtenir les images aussi bien. Au début, je faisais tout dans le fil principal, donc il traînait beaucoup. Maintenant, j'ai mis le code qui fait les appels http dans une méthode asynchrone. L'application ne lag pas, maispeupler UITableView avec Json image URL appels rapides

1) Les images ne télécharge pas dans l'ordre (je ne me dérange pas tant que ça bien qu'il serait plus agréable)

2) Le téléchargement est lent, la mémoire frappe autour 250-270mb et le processeur environ 40-50% alors que le réseau est d'environ 500kb/s.

Je ne possède pas d'iPhone pour faire un vrai test mais avec ces chiffres, je vois que l'application utilise beaucoup de ressources. Je me demande pourquoi le réseau est si lent cependant. Utiliser 3g-4g doit être plus rapide et moins stressant à mon avis et je ne sais pas ce que l'émulateur utilise.

Donc, ma question, y at-il un moyen pour mon application d'aller plus vite ou d'utiliser moins de ressources? Ci-dessous le code qui place les données dans TableView.

Il faut moins de 2 secondes pour remplir la table avec les cordes et beaucoup de temps pour télécharger toutes les images.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cellIdentifier = "GameTableViewCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! GameTableViewCell 
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 

    cell.nameLabel?.text = games[indexPath.row].name 
    cell.releaseDateLabel?.text = games[indexPath.row].releaseDate 

    dispatch_async(backgroundQueue, { 
     for _ in self.games{ 
      if let url = NSURL(string: self.games[indexPath.row].gameImage!) { 
       if let data = NSData(contentsOfURL: url){ 
        cell.photoImageView?.contentMode = UIViewContentMode.ScaleAspectFit 
        cell.photoImageView?.image = UIImage(data: data) 
       } 
      } 
     } 
    }) 
    return cell 
} 

Répondre

0

J'étais sceptique parce que je ne l'ai jamais utilisé une bibliothèque à l'extérieur, mais l'effacement 5- 10 lignes de code pour simplement taper le code ci-dessous .. eh bien, cela fait gagner beaucoup de temps et d'ennuis.

if let url = NSURL(string: self.games[indexPath.row].gameImage!) { 
     cell.photoImageView?.hnk_setImageFromURL(url) 
    } 
1

Vous téléchargez les images chaque fois que vous souhaitez afficher une cellule. Vous devez utiliser NSCache ou toute autre solution tierce ou quelque chose d'aussi simple que NSMutableDictionary pour mettre en cache les images téléchargées avec succès afin de ne pas les télécharger à chaque fois.

Vous pouvez également utiliser les solutions tierces existantes comme AlamofireImage et SDWebImage qui fournissent le téléchargement async d'images, montrant l'image d'espace réservé et la mise en cache

+0

Je vais essayer à ma façon et si je ne peux pas, je vais ajouter une bibliothèque tierce merci pour l'info. –