Почему мои фотографии из Firebase Storage не загружаются в UICollectionView? - PullRequest
0 голосов
/ 10 октября 2019

Я использую UICollectionView в своем приложении для iOS, чтобы пользователи могли просматривать свои фотографии в виде сетки. Их фотографии хранятся в Firebase Storage, и их следует извлечь и отобразить в UICollectionView. Однако я не уверен, как мне это сделать. Я искал в Интернете, но не могу найти качественные учебники о том, как успешно завершить это. Я также искал переполнение стека и не смог найти никаких вопросов, кроме этот , однако, он не имеет ответов. Вот пошаговое руководство моего текущего кода:

Это функция, используемая для загрузки изображений в Firebase Storage. uploadImage(imageData: ) принимает объект Data, который извлекается через UIImagePickerController. Эта функция работает отлично:

func uploadImage(imageData: Data) {
    let imageID = UUID().uuidString
    let storageRef = Storage.storage().reference(withPath: "\(partyID)_photo_sharing_images/\(imageID).jpg")
    let metadata = StorageMetadata()
    metadata.contentType = "image/jpeg"

    storageRef.putData(imageData, metadata: metadata) { (metadata, err) in
        if let err = err {
           self.showAlertWithOK(title: "An Error Occurred", message: "Something went wrong while uploading your image.")
               print("An error occurred: \(err)")
           }

           storageRef.downloadURL { (url, err) in
              if let err = err {
                  print("An error occurred: \(err.localizedDescription)")
              }

              guard let url = url else { return }
              self.uploadImageData(url: url.absoluteString)
          }
     }
}

Как только изображение загружено в Firebase Storage, я использую функцию uploadImageData(url: ) для загрузки URL-адреса изображения в Google Cloud Firestore. После этого я начал бороться с моим кодом.

Я создал пользовательский объект с именем Photo, который имеет три различных значения: URL, String и Int. У меня есть массив Photo объектов, и я читаю из массива, чтобы загрузить изображения из Firebase Storage в UICollectionViewCell. Вот код, который делает это:

func loadImagesData() {
    let db = Firestore.firestore()
    let partyRef = db.collection("parties").document(partyID)

    partyRef.addSnapshotListener() { (snapshot, err) in
        if let err = err {
           print("An error occurred: \(err.localizedDescription)")
           self.showAlertWithOK(title: "An Error Occurred", message: err.localizedDescription)
        } else {
           let photoSharingImages = snapshot?.data()?["photo_sharing_images"] as? [String] ?? [String]()

           for photoSharingImage in photoSharingImages {
               guard let url = URL(string: photoSharingImage) else {
               print("Unable to retrieve URL from photo sharing image URL.")
               return
           }

            let photo = Photo(photographer: "none", likes: 0, url: url)
            self.photos.append(photo)
         }

         print("These are the URL from the array: \(photoSharingImages)")
     } 
}

loadImagesData() получает URL-адреса загрузки изображений из Firestore и добавляет их в Photo. Этот новый Photo затем добавляется в массив photos. Затем необходимо добавить photos в UICollectionView, используя URL-адреса загрузки, полученные из Firestore. В настоящее время я использую функцию под названием loadImage(), которая загружает изображение из хранилища и загружает его в память. Вот функция, которую я создал для этого.

func loadImage(photo: Photo) -> UIImage {
    let storageRef = Storage.storage().reference(forURL: photo.url.absoluteString)

    var image: UIImage?
    storageRef.getData(maxSize: 1 * 1024 * 1024) { data, err in
       if let err = err {
         print("An error occurred: \(err.localizedDescription)")
       } else {
         if let data = data {
           image = UIImage(data: data)
         }
       }
    }

    return image ?? UIImage()
}

Затем я вызываю эту функцию в collectionView(_ collectionView:, cellForItemAt indexPath: ) примерно так:

let photo = photos[indexPath.row]

// Configure the cell.
cell.photoImageView.image = loadImage(photo: photo)

Однако фотографии, к сожалению, неотображается в UICollectionViewCell UIImageView. Почему это происходит? Как правильно загрузить фотографии в UICollectionViewCell UIImageView, чтобы решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...