我有一个我想象的非常常见的情况我希望很容易解决 - 一个带有UICollectionView的应用程序,每个单元格中的图像通过http / https从Web服务器上的API获取。
我试图实施iOS 10 prefetching in UICollectionView,以便提前请求可能需要的图片。
在我看来,最佳预取应该满足各种要求:
我已经查看了各种现有的库,例如SDWebImage和Kingfisher,并且很惊讶,似乎没有任何方法可以轻松地使用任一库来满足上述要求
例如,SDWebImage不能满足第二个要求 - 你只能cancel all prefetching,或者你必须为每个图像创建一个预取器(这意味着各种其他SDWebImage功能,比如限制数量)预取图像的并发请求 - 即要求5 - 不再有效。)
这真的是一个难题吗?我错过了一些明显的解决方案吗我是否在追求这些要求?
答案 0 :(得分:0)
如果从 prefetchItemsAt indexPaths 传递的最新索引路径不够,那么您似乎需要实现自己的优先级。
要求1,2,3使用优先级队列(Sorted Heap)完成。要求4取决于您的优先级队列的实施。 5是相当宽泛和模糊的,只是限制了你的方法的提取次数。优先级队列采用泛型类型,因此您可以将它与对象/类一起使用,该对象/类具有您要获取的项目的属性,下面我只使用IndexPath.row来简化。
创建一个优先级队列,作为数据源和缓存之间的中介。
然后通过查看/出列优先级队列并存储在Kingfisher中,将数据设置为从DataSource获取。 您的数据源 - > PriorityQueue - >翠鸟 - >细胞
func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
...
for indexPath in IndexPaths {
//Add the indexPath to the top of the priority queue
//highest priority is determined by the sort function you used when initializing the priority queue.
priorityQueue?.enqueue(indexpath.row)
}
//Call your method for getting the properties
self.fetchObjectsByPriority()
}
func fetchObjectsByPriority() {
if let count = priorityQueue?.count {
for _ in 0...count {
//get the index
var index = self.priorityQueue?.dequeue()
//Alternatively .peek() with out dequeuing item
//get image data and store
dataSource[index].image = ...
}
}
}
确保使用sort函数初始化优先级队列。
您可以从here获得预建优先级队列,您还需要heap来创建优先级队列。
更多关于priority Queues和heap sorting
如果没有相关代码,很难提供有效的解决方案。我希望这会有所帮助,欢呼和祝你好运!