UICollectionview 未从 CoreData 完全加载图像获取随机空白单元格图像
Posted
技术标签:
【中文标题】UICollectionview 未从 CoreData 完全加载图像获取随机空白单元格图像【英文标题】:UICollectionview not fully loaded image from CoreData get randomly blank cell image 【发布时间】:2017-09-22 16:19:03 【问题描述】:嗨,我目前在 ios 10 + Swift 3 上遇到了 UICollectionView 的问题。一旦我的视图加载了每个单元格中的 ImageView,就会随机变为空白,其中一些可以加载。
Here is my random output
现在我必须在重新加载 CollectionView 的数据之前延迟,但它仍然不能 100% 解决我的问题,有时我的单元格仍然是空白的。
视图控制器
@IBOutlet weak var petCollection: UICollectionView!
var petObj: [Pet] = []
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return self.petObj.count
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! PetCollectionViewCell
let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
let dirPath = paths.first!
let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(petObj[indexPath.item].petImage!)
let image = UIImage(contentsOfFile: imageURL.path)
cell.collectionViewImage.image = image
return cell
override func viewDidLoad()
super.viewDidLoad()
self.petCollection.delegate = self
self.petCollection.dataSource = self
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
DispatchQueue.main.asyncAfter(deadline: .now() + 1)
petCollection.reloadData()
UICollectionViewCell
class PetCollectionViewCell: UICollectionViewCell
@IBOutlet weak var collectionViewImage: UIImageView!
我假设是在 UICollectionView 完成创建单元格之前调用了 reloadData。
我使用CoreData存储文件路径,所有图像都保存在文档目录中。
【问题讨论】:
【参考方案1】:是的,您的集合视图将在调用 viewDidLoad 时加载其数据,这就是您的用户进入此视图控制器的时候。
您应该使用这个库,而不是使用延迟来异步重新加载数据:
https://github.com/rs/SDWebImage
它将处理图像的异步加载。
你可以像这样使用这个库:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! PetCollectionViewCell
let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
cell.collectionViewImage.sd_setImage(with: URL(string: "yourPathToImage"), placeholderImage: UIImage(named: "placeholder.png"))
return cell
【讨论】:
该库可以与本地图像文件一起使用吗?因为我使用CoreData来存储保存在文档目录中的图片路径。 是的,您也可以使用本地图像。看看这个:***.com/questions/37970124/… 在我尝试了上面的代码后,问题仍然存在ibb.co/kxhaKQ如果你看到图像它只加载了 3 三张图片,其他的仍然是占位符图像(人类图标)我必须在某个地方重新加载数据吗?跨度> 我发现一个奇怪的问题,如果我将文件名替换成这样 appendingPathComponent("myimage.png") 图像正确显示没有任何问题但是如果我从 CoreData 获取的结果更改为文件名,如 appendingPathComponent( result.imageName) 和 if let image = UIImage(contentsOfFile: imageURL.path) 总是返回 false 好像是 Coredata 还没有加载完成的问题?以上是关于UICollectionview 未从 CoreData 完全加载图像获取随机空白单元格图像的主要内容,如果未能解决你的问题,请参考以下文章
警告:找不到库:Qt5WebKitd.dll、Qt5Cored.dll pyinstaller
在Qt错误显示:“故障模块名称:Qt5Cored.dll”在win 7和调试时:“分段错误”在centos linux和win 7
在vs2010编译qt程序时就会出现错误无法打开文件"Qt5Cored.lib"
在windows下安装了QT creator 编译出来的.exe文件 双击无法执行,提示找不到:没有找到qt5cored.dll