如何创建视图模型以将帖子上传到 firebase

问题描述 投票:0回答:1

我正在尝试创建一个视图模型,该模型允许我将视频网址、图像字符串和文本字符串上传到 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])
                }
            }
ios swiftui viewmodel
1个回答
0
投票

您的代码中有拼写错误。这就是你定义 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()
                   )
© www.soinside.com 2019 - 2024. All rights reserved.