我尝试过的事情:
我更改了以下内容:
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并在某个地方分离侦听器
答案 0 :(得分:1)
此功能
someRef.observeSingleEvent(of: .value, with: { snapshot in
读取节点someRef
,并一次又一次返回其子数据作为快照,而不会离开观察者。进一步的更改将不会触发事件(闭包中的代码)
此
someRef.observe(.value, with: { snapshot in
将观察者添加到someRef节点,检索其子数据并将观察者留在该节点上。将来进行的任何形式的更改都将导致一个事件,并且闭包中的代码将传递一个包含所有子数据的快照。
请注意,两个函数都需要一个DataEventType,因此您可以将其缩短为.value,.childAdded等。
因此,从本质上讲,您无需将它们“转换”为另一个,因为它们具有不同的功能,但至少在最初返回的是相同的数据。 .observe将在子数据更改时继续将数据反馈回应用程序,而这可能是您想要的,也可能不是。