Я создаю простые операции CRUD в приложении и наткнулся на странную особенность, учитывая дизайн SwiftUI Image.
Я пытаюсь загрузить image в Firebase, за исключением того, что мне нужно преобразовать Image в UIImage, а затем в Data.
Вот мой код:
Загрузчик изображений
import UIKit
import Firebase
import FirebaseStorage
import SwiftUI
struct ImageUploader {
static func uploadImage(with image: Data, completion: @escaping(String) -> Void) {
let imageData = image
let fileName = UUID().uuidString
let storageRef = Storage.storage().reference(withPath: "/profile_images/\(fileName)")
storageRef.putData(imageData, metadata: nil) { (metadata, error) in
if let error = error {
print("Error uploading image to Firebase: \(error.localizedDescription)")
return
}
print("Image successfully uploaded to Firebase!")
}
storageRef.downloadURL { url, error in
guard let imageUrl = url?.absoluteString else { return }
completion(imageUrl)
}
}
}
Посмотреть модель
import SwiftUI
import Firebase
func uploadProfileImage(with image: Data) {
guard let uid = tempCurrentUser?.uid else { return }
let imageData = image
ImageUploader.uploadImage(with: imageData) { imageUrl in
Firestore.firestore().collection("users").document(uid).updateData(["profileImageUrl":imageUrl]) { _ in
print("Successfully updated user data")
}
}
}
ImagePicker
import SwiftUI
import PhotosUI
@MainActor
class ImagePicker: ObservableObject {
@Published var image: Image?
@Published var imageSelection: PhotosPickerItem? {
didSet {
if let imageSelection {
Task {
try await loadTransferrable(from: imageSelection)
}
}
}
}
func loadTransferrable(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: \(error.localizedDescription)")
}
}
}
Вид
if let image = imagePicker.image {
Button {
viewModel.uploadProfileImage(with: image)
} label: {
Text("Continue")
.font(.headline)
.foregroundColor(.white)
.frame(width: 340.0, height: 50.0)
.background(.blue)
.clipShape(Capsule())
.padding()
}
.shadow(radius: 10.0)
.padding(24.0)
}
Как видите, у меня есть проблема в представлении: невозможно преобразовать значение типа «Изображение» в ожидаемый тип аргумента «Данные», что имеет смысл. Изображения все типа Data.
Как мне это сделать?





не используйте @Published var image: Image? в своем class ImagePicker: ObservableObject, Image — это вид, который можно использовать в других Views.
Используйте @Published var image: UIImage? и соответствующим образом измените свой код.
Затем используйте image.pngData(), чтобы получить Data для загрузки.
Да! Извини. Думал, что сделал это в безумной спешке.
если мой ответ помог, пожалуйста, примите его, используйте галочку рядом с ним, он станет зеленым.