Как вы сжимаете выбранное изображение в firebase с помощью Swift PhotoPicker?
Я переключился с использования средства выбора фотографий UIViewController на новое родное средство выбора фотографий Swift. Сам сборщик изображений работает нормально, но загрузка в firebase не работает.
Я хочу сжать изображение, чтобы не слишком быстро заполнять мое хранилище Firebase. Со старым средством выбора изображений у меня был этот код для этого:
guard let imageData = Image.jpegData(compressionQuality: 0.5) else
{ return }
ref.putData(imageData, metadata: nil) { _, error in
if let error = error {
print("DEBUG: Failed to upload image with error: \(error.localizedDescription)")
return
}
но теперь я не могу заставить оператор Guard Let работать, потому что «Тип« Изображение »не имеет члена« jpegData »». Поскольку я больше не использую UIImage, я не уверен, как сжимать изображение.
Файл ImageUploader
import PhotosUI
import FirebaseStorage
import SwiftUI
enum UploadType {
case profile
case post
case story
var filePath: StorageReference {
let filename = NSUUID().uuidString
switch self {
case .profile:
return Storage.storage().reference(withPath: "/profile_image/\(filename)")
case .post:
return Storage.storage().reference(withPath: "/post_image/\(filename)")
case .story:
return Storage.storage().reference(withPath: "/story_image/\(filename)")
}
}} struct ImageUploader {
static func uploadImage(image: Image?, type: UploadType, completion: @escaping(String) -> Void) {
let ref = type.filePath
guard let imageData = Image.jpegData(compressionQuality: 0.5) else { return }
ref.putData(imageData, metadata: nil) { _, error in
if let error = error {
print("DEBUG: Failed to upload image with error: \(error.localizedDescription)")
return
}
ref.downloadURL { imageUrl, _ in
guard let imageUrl = imageUrl?.absoluteString else { return }
completion(imageUrl)
}
}
}
}
Файл ImagePicker — на всякий случай
@MainActor
class ImagePicker: ObservableObject {
@Published var image: Image?
@Published var imageSelection: PhotosPickerItem? {
didSet {
if let imageSelection {
Task {
try await loadTransferable(from: imageSelection)
}
}
}
}
func loadTransferable(from imageSelection: PhotosPickerItem?) async throws {
do {
if let data = try await imageSelection?.loadTransferable(type: Data.self) {
if let uiImage = UIImage(data: data) {
self.image = Image(uiImage: uiImage)
}
}
} catch {
print(error.localizedDescription)
image = nil
}
}
}