2017-02-07 7 views
0

Я работаю над проектом VirtualTourist на Udacity, и нам необходимо отображать изображения при обновлении изображений через Flickr Client. В настоящее время моя реализация такова, что обновление будет отображаться только после полной загрузки изображений. Проект требует, чтобы изображения отображались как при загрузке, а во время загрузки отображается индикатор активности.Изображения, показывающие с активностьюИндикатор в качестве изображений обновляется

Мой код выглядит следующим образом:

@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 
    } 

Некоторые советы здесь очень ценится, спасибо!

+0

В чем вопрос в этом вопросе? –

ответ

0

Итак, во-первых, когда вы нажимаете newCollectionButton, вы удаляете все данные, хранящиеся в основных данных, а также удаляете все те, которые отображаются в виде коллекции. Таким образом, в этот момент в представлении коллекции ничего не видно. в результате он должен быть пустым, показывая ничего.

Теперь, я думаю, ваши методы loadPhotos возвращают коллекцию фотографий из мерцания, которые вы добавляете в свой локальный массив и coredata. datasource просмотра коллекции должен использовать данные из массива photos.

Вы удаляете индикатор активности, а затем повторно загружаете представление коллекции. На этом этапе у вас уже есть необходимые данные для доступных изображений. Таким образом, cellForItemAt извлекает данные из локального массива и создает изображение и отображает его. Возможно, этот процесс происходит так быстро, что ваш cell.activityIndicator.startAnimating() & cell.activityIndicator.stopAnimating() выполняет намного быстрее.

Поскольку Ваш вопрос неясен, & ваш loadPhotos получает коллекцию фотографий данных, если вы хотите, что activityIndicator будет показан в каждой ячейке, пока все изображение не получает загружены, вы можете

  • Удалить только ImageData настоящее в Photo объекта, сохраненного в локальной/CoreData
  • делают клетки, чтобы показать индикатор активности, если нет данных изображения присутствуют в каждой клетке
  • reloadData(), так что индикатор активности начинает
  • звонок loadPhotos
  • После загрузки всех фотографий, очистки фото массива, загрузите Photos в массив и вызовите reloadData(), чтобы все изображения отображались.