如何将observeDataEventType.value的firebase快照转换为observeSingleEvent?

时间:2020-10-06 11:27:54

标签: swift firebase firebase-realtime-database firebase-security snapshot

我尝试过的事情

我更改了以下内容:

 refArtists = Database.database().reference().child("people");
    
    refArtists.observe(DataEventType.value,  with: { [weak self]snapshot in
        guard let self = self else { return }
        
        if snapshot.childrenCount>0{
            
            self.people.removeAll()
                            
            for people in snapshot.children.allObjects as! [DataSnapshot] {

    refArtists = Database.database().reference().child("people");
    
    refArtists.observeSingleEvent(of: .value,  with: { [weak self]snapshot in
        guard let self = self else { return }
        
        if snapshot.childrenCount>0{
            
            self.people.removeAll()               
            
            for people in snapshot.children.allObjects as! [DataSnapshot] {

此外,我尝试过没有弱小的自我和后卫。我还添加了:Database.database().isPersistenceEnabled = true //Swift这些都没有像DataEvent那样在单元格(图像和文本)中产生数据。

控制台警告告诉我什么?

控制台中没有错误警告。

印刷品告诉我什么?

peoplekey仍会打印出来,但是if打印不会很快出现。

完整快照的外观如何?

let thisUsersUid = Auth.auth().currentUser?.uid //Mr. Dunn's uid

refArtists = Database.database().reference().child("people");

refArtists.observeSingleEvent(of: .value,  with: { [weak self]snapshot in


if snapshot.childrenCount>0{
    
    self.people.removeAll()
    
    for people in snapshot.children.allObjects as! [DataSnapshot] {
        
        if people.key != thisUsersUid {
            print("peoplekey",people.key)
            
            let peopleObject = people.value as? [String: AnyObject]
            let peopleEducation = peopleObject?["Education"] as? String
            ...
            let userId = people.key
            
            ...
            
            if Calendar.current.isDateInToday(date) {
                let distance = locCoord.distance(from: self.dict)
                print(distance, "distancexy")
                
                if distance/1609.344 < 3000 && self.array1.contains(people.key){
                    print(self.array1, "f111111")
                    
                    print("fee", self.dict )
                    print(distance, "distancexy")
                    
                    let peopl = Userx(Education: peopleEducation, .......)
                    
                    self.people.append(peopl)
                    let d = people.key
                    self.printPersonInfo(uid:d)
                    
                } else {
                    print ("w")
                }
            } else {
                print ("alpha")
            }
        }

        print("aaaaaaaa", self.people.map {$0.distance})
    }
    self.people.sort { ($0.distance ?? 0) < ($1.distance ?? 0) }
}
})

注意:我要在第一个问题之后添加以下内容。这是单个事件的问题所在(使用self.array1)。

    guard let myUid = Auth.auth().currentUser?.uid else { return }

            refArtists = Database.database().reference().child("people").child(myUid).child("e2")
            
            refArtists.observeSingleEvent(of:.value,  with: {snapshot in
                
               let myDomain = snapshot.value as? String
                self.bSnap = myDomain
                print("haaal", self.bSnap)

                
                
                               let peopleRef = Database.database().reference().child("people")
                               let thisPersonRef = peopleRef.child(myUid).child("e2")
                               thisPersonRef.observeSingleEvent(of:.value,  with: {snapshot in
                                   
                                       if snapshot.exists() {

            

                let query = Database.database().reference().child("people").queryOrdered(byChild: "e2").queryEqual(toValue: self.bSnap)
              query.observeSingleEvent(of: .value, with: { snapshot in
                  var allUsers = snapshot.children.allObjects as! [DataSnapshot]
                  ///////end (1) of comment
                  if let index = allUsers.firstIndex(where: { $0.key == myUid } ) {
                      allUsers.remove(at: index) //remove the current user
                  } /////end (2) of comment
                    
                    for userSnap in allUsers {
                        let name = userSnap.childSnapshot(forPath: "postID").value as? String
                        print(name, "NNN")

                    if let unwrappedName = name {
                        self.array1.append(unwrappedName)
                    }
                    }

                print(self.array1, "ahah")
                    
                  
                
                
                })
                                        
                                       } else {
                                print("no")
                                        
                                }
              })

          })

我想,另一种选择是保留DataEventType并在某个地方分离侦听器

1 个答案:

答案 0 :(得分:1)

此功能

someRef.observeSingleEvent(of: .value, with: { snapshot in

读取节点someRef,并一次又一次返回其子数据作为快照,而不会离开观察者。进一步的更改将不会触发事件(闭包中的代码)

someRef.observe(.value, with: { snapshot in

将观察者添加到someRef节点,检索其子数据并将观察者留在该节点上。将来进行的任何形式的更改都将导致一个事件,并且闭包中的代码将传递一个包含所有子数据的快照。

请注意,两个函数都需要一个DataEventType,因此您可以将其缩短为.value,.childAdded等。

因此,从本质上讲,您无需将它们“转换”为另一个,因为它们具有不同的功能,但至少在最初返回的是相同的数据。 .observe将在子数据更改时继续将数据反馈回应用程序,而这可能是您想要的,也可能不是。