我在自定义collectionView上加载图像时遇到问题

时间:2016-07-13 19:46:29

标签: swift uicollectionview

我有tableViews,其中包含每个行文件夹(相册图片),我将图像保存到文档目录中 当我选择我在自定义collectionView中输入的每个文件夹,其中包含文档目录中的所有图像并将其显示在单元格上,我的问题是collectionView非常慢,加载collectionViewCells中的图像需要5加载collectionViewCells

中的所有图像时为7秒

以下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

    }

解决我的大问题的任何想法

谢谢你提前

1 个答案:

答案 0 :(得分:0)

我刚刚看到你正在运行一个后台线程,但是在中途返回主线程。您需要在后台线程中加载数据(本例中的图像)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

此外,如果您在viewDidLoad而不是viewWillAppear中加载图片,那么您不需要重新加载集合视图,因为它将在此之后加载并使用数据要填充的来源(在您的情况下为self.arrayOfImg)。

我还建议您不要在代码中调整图像大小,但使用约束来执行此操作。请查看Apple指南中的Working with Constraints in Interface Builder

你的图片可能太大了吗?