Swift 3和Firebase观察孩子是否存在

时间:2017-11-10 07:53:15

标签: ios swift firebase firebase-realtime-database

需要观察 Firebase数据库中的节点(如果存在)。 enter image description here

我使用的代码是:

 var COLOR_REF = Database.database().reference().child("Colors")

self.COLOR_REF.child(id).observe(.childAdded) { (snapshot) in
                let key = snapshot.key
                Api.Post.getMyPosts(withId: key, completion: { (post) in
                    completion(post)
                })
            }

id可能存在也可能不存在... 我需要的是进行观察

  if child(id) exist else do something else.

有没有办法在一次观察中这样做,或者我需要观察COLOR_REF,然后如果id存在,请观察孩子?

谢谢! -----------------------------更新 根据图片,我可以说我的身份是:

D7CGNLehdjksnjkdsiwgqauymj3 我按照这样的方式进行观察:

COLOR_REF.child(id).observe(.childAdded) { (snapshot) in
if snapshot.exists() {
print("YES")
} else {
print("No")
}
 let key = snapshot.key
  Api.Post.getMyPosts(withId: key, completion: { (post) in
  completion(post)
     })
   }

假设我执行观察时的id,控制台不会打印"是"也不是" NO"。所以基本上似乎永远不会进入观察者

-----------------------------第二次更新 以下是我现在的表现:

func observeFeed(withUserId id: String, completion: @escaping (Post) -> Void, isEmpty: @escaping () -> Void) {
    COLORS_REF.observe(.value) { (snapshot) in
        if snapshot.hasChild(id) {
            self.COLORS_REF.child(id).observe(.childAdded) { (snapshot) in
                let key = snapshot.key
                Api.Post.getMyPosts(withId: key, completion: { (post) in
                    completion(post)
                })
            }
        } else {
            isEmpty()
        }
    }
}

就像这样工作......我会在完成后将所有内容存储在一个数组中。我的问题是,如果它是第一次用户登录数据库的那一部分将是空的。 所以我想知道是否有办法实现这一目标而不必使用双重观察者......

3 个答案:

答案 0 :(得分:0)

您可以通过检查snapshot.exists()是否在这样的观察中返回true或false来检查id是否存在:

    self.COLOR_REF.child(id).observe(.childAdded) { (snapshot) in
            if snapshot.exists() {
               //the id is valid
            }
            else {
                //the id is not there. do something else
             }

    }) { (error) in

        print(error.localizedDescription)

        //snapshot might have been nil, or there was no id or security rules denied permission to read. do something else.

    }

答案 1 :(得分:0)

像这样你问? Firebase本身提供了一个默认函数,可以在处理程序执行后检查快照是否为空?

self.COLOR_REF.child(id).observe(.childAdded) { (snapshot) in

if snapshot.exists(){
    //id exists
    let key = snapshot.key
    Api.Post.getMyPosts(withId: key, completion: { (post) in
        completion(post)
    })
}
else{
    //id do not exists
}

}

Reupdate - 回答

因为你想检查DB中存在的ID是否可以通过两种方式进行管理

1)当你加载应用程序或任何地方并使用该数组进行检查时,在数组中使所有id号离线 2)当第一个处理程序满足时,需要使用两个处理程序进入第二个

需要代码我将为第二个选项设计

更新答案 -

如何将数据库中关于isDatabaseEmpty的值作为Bool或字符串

进行管理

Sp DB就像

----Root
  ---UserID
    --isDatabaseEmpty : "True" // if first time user and "False" //if db has values
      --Colors
        -Value1
        -Value2

  ---UserID
    --isDatabaseEmpty : "True" // if first time user and "False" //if db has values
      --Colors
        -Value1
        -Value2

现在检查isDatabaseEmpty如果为False转到第二个处理程序否, 它有帮助吗?

答案 2 :(得分:0)

我能修复的唯一方法就是这样:

#primary-menu { 
    float: right; 
}

#header.full-header #primary-menu > ul {
   float: left;
   padding-right: 15px;
   margin-right: 15px;
   border-right: 1px solid #EEE;
}

#primary-menu ul {
     list-style: none;
     margin: 0;
}

#page-menu nav {
   position: relative;
   float: right;
}

#page-menu nav ul {
   margin-bottom: 0;
   height: 44px;
}