我正在尝试创建一个视图模型,该模型允许我将视频网址、图像字符串和文本字符串上传到 firebase swiftui ios16,但我在视图模型上使用的当前代码收到错误,不允许我上传数据我的字符串都没有上传到 firebase。如何重写此代码以将我的帖子上传到 firebase 来解决我的问题?
在范围内找不到“videourl”
let post = Post(
ownerUid: uid,
text: text,
videoUrl: videourl, likes: 0,
replyCount: 23,
imageUrl: imageUrl, timestamp: Timestamp()
)
class UploadPostViewModel: NSObject, ObservableObject {
@Published var didUploadPost = false
@Published var isLoading = false
@Published var error: Error?
@Published var videos = [Video]()
@Published var mediaPreview: Movie?
@Published var profileImage: Image?
@Published var text = ""
@Published var selectedImage: PhotosPickerItem? {
didSet { Task { await loadImage(fromItem: selectedImage)
Task { try await uploadVideo() }
} }
}
private var uiImage: UIImage?
func uploadPost(caption: String) async throws {
guard let uid = Auth.auth().currentUser?.uid else { return }
var imageUrl: String? = nil
if let image = uiImage {
imageUrl = try await ImageUploader.uploadImage(image: image , type: .post)
}
let item = selectedImage
let videoData = try await item!.loadTransferable(type: Data.self)
let videoUrl = try await VideoUploader.uploadVideo(withData: videoData!)
let post = Post(
ownerUid: uid,
text: text,
videoUrl: videourl, likes: 0,
replyCount: 23,
imageUrl: imageUrl, timestamp: Timestamp()
)
try await PostService.uploadPost(post)
self.didUploadPost = true
}
func loadImage(fromItem item: PhotosPickerItem?) async {
guard let item = item else { return }
guard let data = try? await item.loadTransferable(type: Data.self) else { return }
guard let uiImage = UIImage(data: data) else { return }
self.uiImage = uiImage
self.profileImage = Image(uiImage: uiImage)
}
func uploadVideo() async throws {
guard let item = selectedImage else {return}
guard let videoData = try await item.loadTransferable(type: Data.self) else {return}
guard let videoUrl = try await VideoUploader.uploadVideo(withData: videoData) else { return}
try await Firestore.firestore().collection("videos").document().setData(["videoUrl": videoUrl])
}
}
您的代码中有拼写错误。这就是你定义 videourl 的方式:
if let image = uiImage {
imageUrl = try await ImageUploader.uploadImage(image: image , type: .post)
}
let item = selectedImage
let videoData = try await item!.loadTransferable(type: Data.self)
let videoUrl = try await VideoUploader.uploadVideo(withData: videoData!)
这就是您后来引用它的方式:
let post = Post(
ownerUid: uid,
text: text,
videoUrl: videourl, likes: 0, /// <---- This should be videoUrl
replyCount: 23,
imageUrl: imageUrl, timestamp: Timestamp()
)
你应该写:
let post = Post(
ownerUid: uid,
text: text,
videoUrl: videoUrl, likes: 0, ///
replyCount: 23,
imageUrl: imageUrl, timestamp: Timestamp()
)