iOS Swift UICollectionView 照片浏览 - 当单元格不可见时如何停止取消 DispatchQueue

Posted

技术标签:

【中文标题】iOS Swift UICollectionView 照片浏览 - 当单元格不可见时如何停止取消 DispatchQueue【英文标题】:iOS Swift UICollectionView Photo browsing - how to stop cancel DispatchQueue when cells not visible 【发布时间】:2017-07-25 04:52:42 【问题描述】:

我有一个照片浏览应用程序。我正在使用 UICollectionView 来显示照片列表。通过下载网站的 html 源并获取照片 URL,从我的网站中提取照片。对于 UICollectionView 中的每个单元格,我必须从不同的 URL 下载 HTML 源代码并从中提取照片。这是我的 cellForItem 函数:

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")
                                
                            )
     ...

我只让网页在html源下载后使用缓存下载一次。 这是 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)
            
        
    

当滚动视图到达底部时,应用程序将从服务器加载更多数据,这就是问题所在:当我一直向下滚动到底部时,应用程序仍在下载所有单元格的所有 HTML 源,我有在加载下一页数据之前等待一段时间。这是因为许多 HTML 下载任务正在运行,并且会占用大量 Internet 带宽

我希望当用户滚动集合视图时,那些未完成的html下载任务需要停止不可见单元格的getHTMLSource函数,以节省互联网带宽用于其他可见单元格的html下载任务。

【问题讨论】:

【参考方案1】:

NSOperationQueue 是取消所有操作的最佳方法。但是如果你想通过 DispathQueue 来完成。我们可以通过作为 workItem 取消添加到调度队列中的项目

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

通过调用取消来取消工作项

 item.cancel()

【讨论】:

以上是关于iOS Swift UICollectionView 照片浏览 - 当单元格不可见时如何停止取消 DispatchQueue的主要内容,如果未能解决你的问题,请参考以下文章

Swift5 踩过的坑和奇怪的API笔记

Swift5 踩过的坑和奇怪的API笔记

iOS 7 - UICollectionElementKindSectionHeader 使应用程序崩溃('UICollectionView 数据源未设置')

iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局

Storyboards + UIcollectionView:UI 在 iOS 模拟器和设备上的显示方式不同

iOS集合视图单元格高亮和选中的区别