0

J'ai une application de navigation photo. J'utilise UICollectionView pour afficher la liste des photos. Les photos sont extraites de mon site Web en téléchargeant la source HTML du site Web et obtenir des URL de photos. Pour chaque cellule de UICollectionView, je dois télécharger une source HTML à partir d'une URL différente et en extraire des photos. Voici ma fonction cellForItem:iOS Swift UICollectionView Photo browsing - comment arrêter l'annulation DispatchQueue lorsque les cellules ne sont pas visibles

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "siteAlbumCellID", for: indexPath) as! AlbumCell 
    ... 
    getListPhotoURLs(album: album, updateSite: updateSite, handler: { [weak self] (photos) in 
           guard let ss = self else { return } 
           if let photos = photos{ 
            if photos.count > 0{ 
             ... 
            } 
           }else{ 
            cell.aiView.stopAnimating() 
            cell.ivPhoto.image = #imageLiteral(resourceName: "cover") 
           } 
          }) 
    ... 
} 

Je ne laissez la page web à télécharger une fois en utilisant le cache après la souce html est téléchargé. et voici la fonction getListPhotoURLs:

func getHTMLSource(url: String, cookie: String? = nil, handler: @escaping (_ result:String?) -> Void){ 
    DispatchQueue.global().async { 
     guard let myURL = URL(string: url) else { 
      print("Error: \(url) doesn't seem to be a valid URL") 
      DispatchQueue.main.async { 
       handler(nil) 
      } 
      return 
     } 
     do { 
      var myHTMLString = try String(contentsOf: myURL, encoding: .utf8) 

      DispatchQueue.main.async { 
       handler(myHTMLString) 
      } 
     } catch let error { 
      print("Error: \(error)") 
      DispatchQueue.main.async { 
       handler(nil) 
      } 
     } 
    } 
} 

Lorsque scrollview atteint le fond, l'application chargera plus de données à partir du serveur, voici où le problème se pose: quand je fais défiler tout le chemin vers le bas, l'application est encore télécharger toutes les sources HTML pour toutes les cellules, et je dois attendre un certain temps avant que les données de la page suivante soient chargées. Je veux que lorsque les utilisateurs font défiler la vue de collection, et que ces tâches de téléchargement html inachevées doivent arrêter la fonction getHTMLSource pour les cellules qui ne sont pas visibles, pour économiser la bande passante Internet pour d'autres tâches de téléchargement html de cellules visibles.

Répondre

0

NSOperationQueue est la meilleure approche pour annuler toutes les opérations .Mais si vous voulez le faire par DispathQueue.We peut annuler les éléments ajoutés dans la file d'attente de répartition en ayant comme workItem

let queue = DispatchQueue.main 
    var item: DispatchWorkItem! 
    // create work item 
    item = DispatchWorkItem{ 
     //perform functionality 
    } 
    queue.async(execute: item) 

annuler élément de travail en appelant annuler

item.cancel()