显示带有activityIndi​​cator作为图像的图像正在刷新

时间:2017-02-07 15:08:39

标签: ios swift core-data

我正在研究Udacity上的VirtualTourist项目,我们需要在通过Flickr客户端刷新图像时显示图像。目前我的实现是只有在完全下载图像后才会显示刷新。该项目要求图像在下载时显示,并且在下载发生时,显示活动指示器。

我的代码如下:

 @IBAction func newCollectionButtonDidTap(_ sender: Any) {
        print("FETCHING NEW COLLECTION...")
        DispatchQueue.main.async {
            self.photos.removeAll()
            self.collectionView.reloadData()
            print("Reload Data newColVC")
        }
        for items in fetchedResultsController.fetchedObjects! {
            context.delete(items as! NSManagedObject)
        }

        loadPhotos()
    }

func loadPhotos() {
        newColActivityIndicator.startAnimating()
        newColActivityIndicator.isHidden = false
        newCollectionButton.isUserInteractionEnabled = false
        newCollectionButton.alpha = 0.4

        FlickrClient.sharedInstance.getPhotos(pin.coordinate.latitude as AnyObject, lon: pin.coordinate.longitude as AnyObject, { (results, error) in
            if let error = error {
                print(error)
            } else {
                if results != nil {

                    for result in results! {
                        let picture = Photo(pin: self.pin, imageData: result as NSData, context: self.context)
                        self.photos.append(picture)
                    }

                    do {
                        try self.delegate.stack?.saveContext()
                    } catch let error as NSError {
                        print("Error saving context in loadPhotos(): \(error.localizedDescription)")
                    }

                    DispatchQueue.main.async {
                        self.collectionView.reloadData()
                        self.newColActivityIndicator.stopAnimating()
                        self.newColActivityIndicator.isHidden = true
                        self.newCollectionButton.isUserInteractionEnabled = true
                        self.newCollectionButton.alpha = 1.0
                        print("Reload Data loadPhotos")

                    }

                }
            }
        })

    }



func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ImageViewCell

        cell.activityIndicator.startAnimating()
        cell.activityIndicator.isHidden = false

        let photo = photos[indexPath.row]

        if let photoImage = photo.imageData {
            print("PhotoImage present")
            DispatchQueue.main.async {
                cell.activityIndicator.stopAnimating()
                cell.activityIndicator.isHidden = true
                cell.imageView?.image = UIImage(data: photoImage as Data)
            }

        } else {
            print("PhotosImage don have")
        }

        return cell
    }

非常感谢这里的一些建议,谢谢!

1 个答案:

答案 0 :(得分:0)

首先,当您点击newCollectionButton时,您将删除存储在核心数据中的所有数据,并删除所有正在集合视图中显示的数据。所以在这个时刻,集合视图没有任何东西要显示。结果它应该是空的,什么也没有。

现在,我认为您的loadPhotos方法会从闪烁中返回照片集合,您可以将其添加到本地数组和coredata中。集合视图的数据源必须使用photos数组中的数据。

删除活动指示符,然后重新加载集合视图。此时,您已经拥有了可用的图像所需的数据。因此cellForItemAt将从本地数组中检索数据,并创建图像并显示它。也许这个过程发生得如此之快,以至于cell.activityIndicator.startAnimating()& cell.activityIndicator.stopAnimating()的执行速度要快得多。

由于你的问题不清楚,&你的loadPhotos提取照片数据集合,如果你想在每个单元格中显示activityIndi​​cator,直到所有图像都被下载,你可以

  • 仅删除存储在local / coredata
  • 中的Photo对象中的imagedata
  • 如果每个单元格中没有图像数据,则使单元格显示活动指示符
  • reloadData()以便活动指示器启动
  • 致电loadPhotos
  • 下载所有照片后,清除照片阵列,将下载的照片存储在数组中并调用reloadData()以便显示所有图像。