Swift 我在自定义collectionView上加载图像时遇到问题
我有Swift 我在自定义collectionView上加载图像时遇到问题,swift,uicollectionview,Swift,Uicollectionview,我有tableview,其中包含我将图像保存到文档目录中的每一行文件夹(相册图像) 当我选择我在自定义collectionView中输入的每个文件夹时,该文件夹包含文档目录中的所有图像,并将其显示在单元格上,我的问题是collectionView在collectionViewCells中加载图像的速度非常慢,在collectionViewCells 视图中“我的代码”下面将显示以下内容: override func viewWillAppear(animated: Bool) {
tableview
,其中包含我将图像保存到文档目录中的每一行文件夹(相册图像)
当我选择我在自定义collectionView
中输入的每个文件夹时,该文件夹包含文档目录中的所有图像,并将其显示在单元格上,我的问题是collectionView在collectionViewCells
中加载图像的速度非常慢,在collectionViewCells
视图中“我的代码”下面将显示以下内容:
override func viewWillAppear(animated: Bool) {
setEditing(false, animated: true)
arrayOfImagesFromDocumentDirectory = []
dictionaryOfGetImageUrl = [:]
dictionaryOfImagesForExport = [:]
arrayImageForMove = []
moveArrayImageOfUrl = []
arrayOfImageUrl2 = []
self.navigationItem.title = albumName
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
dispatch_async(dispatch_get_main_queue(), {
let fileManager2 = NSFileManager.defaultManager()
do {
let document = try fileManager2.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
let getFolders = try fileManager2.contentsOfDirectoryAtURL(document, includingPropertiesForKeys: nil, options: .SkipsHiddenFiles)
for folder in getFolders {
if folder.lastPathComponent! == albumName {
let getImages = try fileManager2.contentsOfDirectoryAtURL(folder, includingPropertiesForKeys: nil, options: .SkipsHiddenFiles)
for img in getImages {
self.arrayOfImagesFromDocumentDirectory.append(UIImage(contentsOfFile: img.path!)!)
self.arrayOfImageUrl2.append(img.path!)
}
}
}
}catch {
print(error)
}
self.arrayOfImg = []
for img in self.arrayOfImagesFromDocumentDirectory {
let img2:UIImage = self.ResizeImage(img, targetSize: CGSize(width: 140, height: 140))
self.arrayOfImg.append(img2)
}
self.myCollectionView.reloadData()
})
}
myCollectionView.reloadData()
}
下面是单元格ForItemAtIndexPath
上的MyCode:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! AlbumImagesCollectionViewCell
if self.dictionaryOfSelectItem.count > 0 {
if self.dictionaryOfSelectItem[indexPath.row] == indexPath.row {
cell.imageViewCheck.image = UIImage(named: "check.png")
}else {
cell.imageViewCheck.image = nil
}
}else {
cell.imageViewCheck.image = nil
}
if self.arrayOfImageUrl2.count > 0 && self.arrayOfImagesFromDocumentDirectory.count > 0 {
if self.arrayOfImg.count > 0 {
cell.imageViewCell.image = self.arrayOfImg[indexPath.row]
cell.imageUrlLabel.text = self.arrayOfImageUrl2[indexPath.row]
}
}
return cell
}
有什么办法解决我的大问题吗
感谢Advance我刚刚看到您正在运行一个后台线程,但正在返回主线程。您需要在后台线程中加载数据(本例中为图像)
dispatch\u async(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u DEFAULT,0)){
此外,如果在viewdiload
中而不是在视图中加载图像,则不需要重新加载collection视图,因为它将在加载后加载,并使用数据源(在您的情况下,self.arrayOfImg
)进行填充
我还建议您不要在代码中调整图像的大小,而是使用约束来进行调整
您的图像可能太大了吗?您的问题到底是什么?将图像从document directry加载到我的collectionView速度非常慢,占用了大量内存。如何将图像快速提取到我的collectionView?您是否调试过以查看其运行速度慢的地方?当我进入collectionView时,我有photo vault应用程序,我需要显示im收集中的老化查看单元格快速在我的情况下,图像显示到单元格需要5到7秒这对用户不好我希望你不了解我明白你的意思,但我想知道你是否已经确定了速度问题所在。是在加载图像时吗?是在分配到单元格时吗?如果我将代码放在viewDidLoad中,则我有e问题,因为如果我在显示图像后删除任何图像,collectionView不会在新图像上更新它,并且我调整了图像的大小,因为我的图像太大,我使用照片框架从照片库中获取它,我还使用dispatch_async(dispatch_get_global_queue(dispatch_queue_PRIORITY_DEFAULT,0))我需要等待5到7秒才能将图像加载到CollectionView。您使用的是错误的,因为您会立即返回到主线程。我想如果您的图像太大,那么如果您动态调整它们的大小,则需要一些时间才能加载所有图像,这可能就是为什么要花费这么长时间的原因。如果您使用约束来代替呢?您的意思是什么约束?文档目录中的图像太大了,我无法按此原始大小获取它,因为我收到内存警告,所以当我向用户显示图像时,我将图像大小调整为宽度125.0高度125.0,当用户从单元格中选择图像时,我获取的图像分辨率较低,因此我从用户选择的文档目录中获取原始图像然后重新调整相册的大小