我有tableViews
,其中包含每个行文件夹(相册图片),我将图像保存到文档目录中
当我选择我在自定义collectionView
中输入的每个文件夹,其中包含文档目录中的所有图像并将其显示在单元格上,我的问题是collectionView非常慢,加载collectionViewCells
中的图像需要5加载collectionViewCells
以下viewWillAppear
中的代码:
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()
}
以下cellForItemAtIndexPath
下的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
}
解决我的大问题的任何想法
谢谢你提前
答案 0 :(得分:0)
我刚刚看到你正在运行一个后台线程,但是在中途返回主线程。您需要在后台线程中加载数据(本例中的图像)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
此外,如果您在viewDidLoad
而不是viewWillAppear
中加载图片,那么您不需要重新加载集合视图,因为它将在此之后加载并使用数据要填充的来源(在您的情况下为self.arrayOfImg
)。
我还建议您不要在代码中调整图像大小,但使用约束来执行此操作。请查看Apple指南中的Working with Constraints in Interface Builder。
你的图片可能太大了吗?