斯威夫特& Firebase:访问信息

时间:2018-01-13 19:07:20

标签: ios swift firebase firebase-realtime-database

我正在创建一个允许共享笔记的应用程序。我在使用Firebase数据库时遇到问题,并且觉得我用来获取用户需要的信息的代码行数量超过了我实际需要的数量,而且最重要的是它不起作用。下面是我的数据库的截图和我使用的代码的显示。我的应用中有3种不同的帐户类型。父母,孩子和其他。

  • 孩子只能看到自己的笔记
  • 家长可以看到所有为其代码撰写笔记的人
  • The Other应该看到他们的笔记和父母的笔记 代码。

我试图显示可以在集合视图中看到其注释的用户。到目前为止它适用于父母和孩子,但不适用于我试图修复的“其他”。

这是我的数据库。现在,Parent创建了一个生成唯一代码的帐户。然后,通过在ViewController上键入代码,可以加入Other或Child。对于子帐户,它会自动将代码添加到用户部分中孩子的帐户,而对于其他人则应该创建一个新部分(我在添加之前添加了一张图片。具有特定代码的所有用户都将添加到该代码下的代码部分。

 {
  "codes" : {
    "ParVWb" : {
      "totalUsers" : 2,
      "users" : {
        "VWbSR8qQyWd9deka6tgbxFC9ahs1" : {
          "numberofNotes" : 0
        },
        "qm12qgkWfdbtSMMx58wIrxKuLKh1" : {
          "numberofNotes" : 0
        }
      }
    }
  },
  "users" : {
    "JN47TBdI4EYX0NvoSHN21o1xFH92" : {
      "email" : "other1@restart.mocs",
      "fullName" : "Other 1 Name",
      "type" : "Other",
      "uid" : "JN47TBdI4EYX0NvoSHN21o1xFH92"
    },
    "VWbSR8qQyWd9deka6tgbxFC9ahs1" : {
      "code" : "ParVWb",
      "email" : "parentemail@restart.mocs",
      "fullName" : "Parent Name",
      "type" : "Parent",
      "uid" : "VWbSR8qQyWd9deka6tgbxFC9ahs1"
    },
    "qm12qgkWfdbtSMMx58wIrxKuLKh1" : {
      "code" : "ParVWb",
      "email" : "childname@restart.mocs",
      "fullName" : "Child Name",
      "type" : "Child",
      "uid" : "qm12qgkWfdbtSMMx58wIrxKuLKh1"
    }
  }
}

Picture of Other User section 我以前使用部分看起来像这样,但现在由于大量的参考块,它不会运行将“代码”部分添加到“其他”用户的部分。

这是我在CollectionViewController中的函数,它根据currentUser类型获取所有需要的用户。

func fetchConnections() {
    ref.child("users").child(userID!).observe(.value, with: { (snapshot) in
        let user = User(snapshot: snapshot)

        if user.type == "Parent" {

            let code = user.code as? String
            let codeRef = databaseRef.child("codes").child(code!).child("users")

            codeRef.observe(.value, with: { (codeSnapshot) in

                if let users = codeSnapshot.value as? [String:AnyObject] {
                    DispatchQueue.main.async(execute: {
                        for user in users {
                            if let dict = user.value as? [String: Any] {
                                let userInformation = cellInfo(uid: user.0, numberofNotes: (dict["numberofNotes"] as? Int)!, code: self.code)
                                self.userCollection.append(userInformation)
                                self.collectionView.reloadData()
                            }
                        }
                    })
                }
            }) { (error) in
                print(error.localizedDescription)
            }

        } else if user.type == "Child" {
            let code = user.code
            self.ref.child("codes").child(code!).child("users").child(self.userID!).observe(.value, with: { (snapshot) in
                if let dict = snapshot.value as? [String: Any] {
                    print(user.key, (dict["numberofNotes"] as? Int)!)
                    let userInformation = cellInfo(uid: (user.key as? String)!, numberofNotes: (dict["numberofNotes"] as? Int)!, code: "code")
                    self.userCollection.append(userInformation)
                    self.collectionView.reloadData()
                }
            })


        } else if user.type == "Other" {

            self.ref.child("users").child(self.userID!).child("codes").observe(.value, with: { (snap) in
                if let codes = snap.value as? [String:AnyObject] {
                    for code in codes {
                        if code.key == "numberofCodes" {
                            print("ignore")
                        } else { // If it's an actual code
                            self.ref.child("users").child(code.0).observeSingleEvent(of: .value, with: { (codeSnap) in
                                let user = User(snapshot: codeSnap)

                                let codetoFetch = user.code

                                self.ref.child("codes").child(codetoFetch!).child("users").child(self.userID!).observe(.value, with: {(codeSnapshot) in
                                    if let users = codeSnapshot.value as? [String:AnyObject] {
                                        DispatchQueue.main.async(execute: {
                                            for user in users {
                                                if let dict = user.value as? [String: Any] {

                                                   let userInformation = cellInfo(uid: code.0, numberofNotes: (dict["numberofNotes"] as? Int)!, code: self.code)
                                                    //self.userCollection.append(userInformation)
                                                    //self.collectionView.reloadData()
                                                }
                                            }
                                        })
                                    }
                                })

                            })
                        }
                    }
                }
            })
        }
    })
}

我如何获得“其他”所属的所有代码以及所有UID&该代码的“父母”的NumberofNotes,以便我可以将它们放入collectionView? (此代码适用于父母和孩子,但如果我这样做的方式很长且无效,请告诉我。)

0 个答案:

没有答案