【问题标题】:Good way to Retrieve information from Firebase Swift从 Firebase Swift 检索信息的好方法
【发布时间】:2023-03-27 06:45:02
【问题描述】:

我和我的朋友正在开发一个集成了(新的)Firebase 的 Swift IOS 项目。我们能够写入 Firebase 数据库,但我们在检索数据时遇到了问题。

我们有一个 tableView 控制器,我们希望从 Firebase 数据库中填充该表。我们的数据库是这样组织的:

root 
|  
- Movies
    |__ -Wjdkfdmlksdf (unique ID made by Firebase)
        |
        |_Actors
          |_A1 = ajkdfnadfdf
          |_A2 = podifpadsfipasdip
        |_Title = "Mission Impossible"
        |_DirectedBy = "Christopher McQuarrie"
-Actors
  |_ -ajkdfnadfdf (unique ID made by Firebase)
         |_name : "Tom Cruise"
         |_Birthday: xx/yy/zz

在项目中,我们创建了一个文件/类,其中包含向 firebase 写入和检索的方法。如果我们想从 Firebase 中检索特定视图控制器的信息,我们只需调用该类中的特定方法即可。

例如,这是类中的方法之一:

func getListOfAllMovieIDs() -> [String] {
     let ref = FIRDatabase.database().reference();
     var ListOfMovieIDS = [String]();
    ref.child("Movies").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
     let postDict = snapshot.value as! [String : AnyObject]
     for (MID, _) in postDict {
       ListOfMovieIDS.append(MID);
     }

    }) { (error) in
        print(error.localizedDescription)
    }

    return listOfMoviesIDS
}

我们将我刚才在viewDidLoad() 中描述的这个方法称为tableViewController。但是,该方法不返回任何内容。我们还调用了另一种方法,例如获取参与者的唯一 IDS 列表,但它也不返回任何内容。有什么建议吗?

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    Firebase 异步加载数据。因此,您无需触发请求并等待响应,而是发送请求,然后在某个时候会收到响应通知。

    如果您在代码中放置一些良好的日志记录语句,您可以很容易地看到这一点:

    func getListOfAllMovieIDs() {
        let ref = FIRDatabase.database().reference();
        print("Before listener");
        ref.child("Movies").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
          print("Inside block");
        })
        print("After listener");
    }
    

    打印语句的顺序为:

    在听众之前

    听者之后

    块内

    因此,当您的函数退出时,数据尚不可用。这不是一个错误,而是一个非常刻意的选择。通过允许代码继续运行,应用程序会保持对用户的响应。大多数现代互联网都使用这种模型,因此通常最好接受它(尽管一开始很难掌握)。

    解决方案通常是改写您的代码。不要说“首先我们加载数据,然后我们执行 xyz”,而是说“我们开始加载数据,一旦我们得到它就执行 xyz”。这就是 Firebase 数据加载方法需要一个块的原因:它包含数据可用后应该发生的“xyz”。

    这样做的一个很好的副作用是,此逻辑也适用于在您最初加载后可能会更新的数据。当您使用objectEventOfType() 时,您可以轻松处理“开始同步数据,只要我们得到数据就执行 xyz”这样的情况,并拥有一个处理实时更新的应用程序。

    【讨论】:

      【解决方案2】:

      尝试使用以下方法,因为当您使用observeSingleEventOfType 方法时;返回初始数据后立即取消该块。这可能是您无法在回调块中看到结果的原因。

      ref.observeEventType(.Value, withBlock: { snapshot in
          println(snapshot.value)
      }, withCancelBlock: { error in
          println(error.description)
      })
      

      【讨论】:

        【解决方案3】:
        • 您只需更新以下函数即可从数据库中获取所有电影 ID:

          func getListOfAllMovieIDs() -> [String] { 
            let ref = FIRDatabase.database().reference();
            var ListOfMovieIDS = [String]();
            ref.child("Movies").observeSingleEventOfType(.Value, withBlock: { (snapshot) in           
              let postDict = snapshot.children.allObjects as? [DataSnapshot] {
              for (index ,movieDict) in postDict.enumerated() {
                 let movieID = movieDict.key
                 ListOfMovieIDS.append(movieID);
              }    
             }) { (error) in
                print(error.localizedDescription)
             }    
             return ListOfMovieIDS
          }
          

        【讨论】:

          猜你喜欢
          • 2017-08-15
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          • 2017-11-06
          • 1970-01-01
          • 1970-01-01
          • 2021-09-09
          • 1970-01-01
          相关资源
          最近更新 更多