在Swift中构建和从Firebase检索数据的问题

时间:2016-08-23 15:15:30

标签: ios json swift firebase firebase-realtime-database

我正在设计一个小问答应用程序,但我在检索游戏数据时遇到了麻烦。

data structure

正如您在图片中看到的,我有一个包含许多单个游戏的JSON对象。每个单一游戏都有一个唯一的ID。我的第一个问题是每个游戏都可以使用多种语言。我知道我可以下载孔按钮然后循环抛出每个游戏但这意味着在应用程序增长时真正需要很长的加载时间。

简短形式:

我需要从上面的JSON中检索以下数据:

  • 以特定语言提供的随机游戏(例如需要使用密钥)

  • " en"中提供的所有游戏但尚未进入" de"

如果更容易重构JSON中的数据,请告诉我。

感谢您帮助我。

1 个答案:

答案 0 :(得分:1)

回答你的第一部分: -

 let enRef = FIRDatabase.database().reference().child("singleGames").child(singleGamesUID).child("en")

  enRef.observeEventType(.Value, withBlock: {(snap) in
  if let enQuizQuestion = snap.value as? [String:AnyObject]{
          //Question exists : Retrieve Data 

      }else{

        //Question in english doesn't exist
    }
})

第二部分 由于您尝试保存迭代时间,我建议您还将singleGames id保存在单独的languagesBased节点中,firebase中有一个命令,允许您在子节点中搜索某些keyValues&# 39; s,但即使我认为会执行搜索算法,这可能会耗费更多时间: -

appServerName:{
  singleGames :{
      uid1:{......
            ......
               ...},
      uid2:{......
            ......
               ...},
      uid3:{......
            ......
               ...}
           },
   enQuestions:{
       uid3 : true
          }
   deQuestions:{
       uid1 : true,   
       uid2 : true
         }
     }

现在你要做的就是: -

let rootRef = FIRDatabase.database().reference().child("deQuestions").observeEventType(.Value, withBlock: {(qSnap) in

    if let qDict = qSnap.value as? [String:AnyObject]{
            for each in qDict as [String:AnyObject]{
              let deUID = each.0
          }
      }else{

      //No question in dutch language
     }
   })