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的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 - UICollectionElementKindSectionHeader 使应用程序崩溃('UICollectionView 数据源未设置')
iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局