【问题标题】:Change View if a file doesn't exist如果文件不存在则更改视图
【发布时间】:2021-06-24 08:01:24
【问题描述】:

我正在尝试检查用户是否有个人资料图片(从 Firebase 存储中检索),如果没有,则向用户显示特定视图。

目前我只检查用户是否已登录,如果已登录,则显示我的 TabViews。

import SwiftUI
import Firebase
import FirebaseStorage

struct ContentView: View {


func getUser() {
    session.listen()
}

@EnvironmentObject var session: SessionStore


var body: some View {
    Group {
        if (session.session != nil) {
            HostingTabView()
        }
        else {
            AuthView()
        }
    }.onAppear(perform: getUser)
}

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(SessionStore())
    }
}

我想要实现的是查找用户是否将以下图像保存在 firebase 存储中,如果是,则显示另一个视图。

let userId = Auth.auth().currentUser!.uid
let storageRef = Storage.storage().reference().child("images").child(id).child("profilePic.png")

我不确定该怎么做。

【问题讨论】:

    标签: swift swiftui firebase-storage


    【解决方案1】:

    这里有几个有用的答案可用于检查文件是否存在:https://stackoverflow.com/a/62982782/560942

    我将在这里使用较短的一个作为示例,但我建议您使用具有更强大的错误处理能力的较长的一个 - 两种方式的主体都是相同的。

    class FirebaseManager : ObservableObject {
    
      @Published var profilePicExists = false
    
      func checkForProfileImage() {
             let storageRef = Storage.storage().reference().child("yourPath").child("\(someFile)")
    storageRef.getMetadata() { (metadata: StorageMetadata?, error) in
            
            if let error = error { return }
        
            guard let metadata = metadata else { return }
            
            if metadata.isFile {
               print("file must exist because metaData is a file")
            } else {
              print("file for metadata doesn't exist")
            }
            
           let size = metadata.size
           if size != 0 {
             print("file must exist because this data has a size of: ", size)
    
             self.profilePicExists = true // <-- Here
           } else {
             print("if file size is equal to zero there must be a problem"
          }
        }
      }
    
    }
    

    然后,为了显示一个条件视图,如果用户登录,您将执行与您正在执行的操作类似的技术:

    var body: some View {
        if manager.profilePicExists {
           //profile pic view
        } else {
           //other view
        }
    }
    

    这是一个非常简单的例子。实际上,您可能希望在异步 getMetadata 正在 加载 并且没有返回值等时显示更多状态。

    【讨论】:

    • 非常感谢您的回答。我有点不确定如何在我的代码中实现这一点。我在我的 ContentView.swift 文件中创建了 FirbaseManager 类。但是,我无法使用 manager.profilePicExists,因为它超出了范围。我想我在这里遗漏了一些基本的东西。
    • @StateObject private var manager = FirebaseManager() -- 您还必须在onAppear 或类似的地方致电checkForProfileImage()。与我在今天早些时候的上一个答案中向您展示的技术非常相似。
    • 我还应该提到,您可能只需将此代码放在您的 SessionStore 中 - 我假设它那里有关于用户 ID 等的数据 - 请注意我也将其排除在我的代码之外.
    • 它现在可以添加 onAppear。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2012-06-16
    • 2011-03-20
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多