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.