Я использую 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
, чтобы решить эту проблему.