从 Firebase 从 URL 加载图像时,CollectionsView 性能不稳定
CollectionsView choppy performance when loading images from a URL from Firebase
从 Firebase 加载图像然后将其填充到单元格中时,性能似乎不稳定。我想这可能是因为图像没有被缓存。
这位于函数中 URL 在 viewDidLoad() 之后立即从返回的搜索结果中收集
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("palettes").queryOrdered(byChild: "top").queryEqual(toValue: "#000000").observeSingleEvent(of: .value, with: { (snapshot) in
if let snapDict = snapshot.value as? [String:AnyObject]{
for each in snapDict as [String:AnyObject]{
let URL = each.value["URL"] as! String
self.URLArray.append(URL)
print(self.URLArray)
}
}
})
这里是填充单元格的函数:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
let textLabel = cell.viewWithTag(2)
let ootdImage = cell.viewWithTag(4) as! UIImageView
if let url = NSURL(string: self.URLArray[indexPath.row]) {
if let data = NSData(contentsOf: url as URL){
ootdImage.image = UIImage(data: data as Data)
}
}
// display images from the dataArray.
textLabel?.backgroundColor = averageColor
return cell
不用担心collectionsView.reloadData()
,目前,我已经设置为必须手动点击按钮才能重新加载数据,但我仍然不明白为什么滚动时会有延迟,特别是因为所有数据都已收集。
性能低下是因为您正在从主线程下载每个图像,这会异步阻止 UI.Download 图像并更新集合视图单元格,这将解决性能问题。
每当您滚动时,与单元格关联的每个图像都会在主线程中下载并导致滚动延迟。
从 Firebase 加载图像然后将其填充到单元格中时,性能似乎不稳定。我想这可能是因为图像没有被缓存。
这位于函数中 URL 在 viewDidLoad() 之后立即从返回的搜索结果中收集
let databaseRef = FIRDatabase.database().reference()
databaseRef.child("palettes").queryOrdered(byChild: "top").queryEqual(toValue: "#000000").observeSingleEvent(of: .value, with: { (snapshot) in
if let snapDict = snapshot.value as? [String:AnyObject]{
for each in snapDict as [String:AnyObject]{
let URL = each.value["URL"] as! String
self.URLArray.append(URL)
print(self.URLArray)
}
}
})
这里是填充单元格的函数:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
let textLabel = cell.viewWithTag(2)
let ootdImage = cell.viewWithTag(4) as! UIImageView
if let url = NSURL(string: self.URLArray[indexPath.row]) {
if let data = NSData(contentsOf: url as URL){
ootdImage.image = UIImage(data: data as Data)
}
}
// display images from the dataArray.
textLabel?.backgroundColor = averageColor
return cell
不用担心collectionsView.reloadData()
,目前,我已经设置为必须手动点击按钮才能重新加载数据,但我仍然不明白为什么滚动时会有延迟,特别是因为所有数据都已收集。
性能低下是因为您正在从主线程下载每个图像,这会异步阻止 UI.Download 图像并更新集合视图单元格,这将解决性能问题。
每当您滚动时,与单元格关联的每个图像都会在主线程中下载并导致滚动延迟。