Как вы сжимаете выбранное изображение в 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
        }
    }
}

0 ответов

Другие вопросы по тегам