gpt4 book ai didi

swift - Geofire/Firebase 函数正在快速执行处理程序多次

转载 作者:行者123 更新时间:2023-11-30 11:26:07 27 4
gpt4 key购买 nike

我有以下函数,它使用 Geofire 然后在嵌套设置中使用 Firebase 查询来获取用户列表。

我首先执行 Geofire 查询来获取 key,然后执行 Firebase 查询并创建与 key 匹配的 User 对象将User附加到一个数组,然后通过handler传回。

然后在CollectionView中使用Userarray,问题是当CollectionView显示它只显示一个 User 对象。

我在代码中放置了一些 print() 行进行调试,并发现每次附加项目时该函数都会通过 handler 传递数据,因此当到达显示 CollectionViewVC 时,数组的计数为 1

将以下行移动到 for 循环 括号之外会传递一个空的数组

如何更新我的函数,以便仅调用一次处理程序并传递完整的数组

handler(self.shuffleArray(array: filteredUsers) as! [User], true)

这是函数:

    //Fetches all users currently at a Venue location of radius 50 metres
func getUsersAtVenue(forVenueLocation venueLocation: CLLocation, forUid uid: String, handler: @escaping (_ users: [User], _ success: Bool) -> ()){

print("uid: \(uid)")

var users = [User]()

guard let currentLocation = LocationSingleton.sharedInstance.lastLocation else { return}//get current user's (device) location

let distanceApart = round(10 * (venueLocation.distance(from: currentLocation) / 1000)) / 10 //get distance between currentLocation and venueLocation and convert from Mts to Kms rounding to 2 decimals

if distanceApart <= 50 { //if distance apart if within 50kms then proceed

let query = self.GEOFIRE_USERS_LOC.query(at: currentLocation, withRadius: 50)//radius in Kms

query.observe(.keyEntered) { (key: String!, userLocation: CLLocation!) in

print(key)

self.REF_USERS.observeSingleEvent(of: .value, with: { (snapshot) in

guard let usersSnapshot = snapshot.children.allObjects as? [DataSnapshot] else { return }

for user in usersSnapshot{

let discoverable = user.childSnapshot(forPath: "discoverable").value as! Bool

if user.key == key && discoverable == true {

let uid = user.key
let name = user.childSnapshot(forPath: "name").value as! String
let email = user.childSnapshot(forPath: "email").value as! String
let profilePictureURL = user.childSnapshot(forPath: "profilePictureURL").value as! String

let birthday = user.childSnapshot(forPath: "birthday").value as! String
let firstName = user.childSnapshot(forPath: "firstName").value as! String
let lastName = user.childSnapshot(forPath: "lastName").value as! String
let gender = user.childSnapshot(forPath: "gender").value as! String
let discoverable = user.childSnapshot(forPath: "discoverable").value as! Bool
let online = user.childSnapshot(forPath: "online").value as! Bool

let dictionary: [String : Any] = ["uid": uid, "name": name, "email": email, "profilePictureURL": profilePictureURL, "birthday": birthday, "firstName": firstName, "lastName": lastName, "gender": gender, "discoverable": discoverable, "online": online]

let user = User(uid: uid, dictionary: dictionary)

users.append(user)

}//end if

}//end for

//filter out current user from array
let filteredUsers = users.filter({ (user: User) -> Bool in return !user.uid.contains(uid) })

print("filteredUsers count: \(filteredUsers.count)")

//handler passing a shuffled version of the array
handler(self.shuffleArray(array: filteredUsers) as! [User], true)

})//end FIR snapshot call

}//end geoquery


} else {//if distanace apart is NOT within 50kms then do this
print("You're too far apart.")
handler(users, false)
}



}//end func

控制台:

uid: dBQd541pxlRypR7l1WT2utKVxdX2
some("dBQd541pxlRypR7l1WT2utKVxdX5")
some("dBQd541pxlRypR7l1WT2utKVxdX3")
some("dBQd541pxlRypR7l1WT2utKVxdX2")
some("dBQd541pxlRypR7l1WT2utKVxdX4")
filteredUsers count: 1
users count: 1
filteredUsers count: 2
users count: 2
filteredUsers count: 2
users count: 2
filteredUsers count: 3
users count: 3

最佳答案

对于地理查询范围内的每个键都会触发 .keyEntered 事件。因此,最初这意味着它会对范围内的所有键触发,从那一刻起,只要有新键进入范围,它就会触发(即,如果您在范围内添加新用户,或者用户移动到范围内)。

听起来您想检测何时为所有初始用户调用 .keyEntered 。为此,您可以观察就绪事件。

query.observeReadyWithBlock({
//handler passing a shuffled version of the array
handler(self.shuffleArray(array: filteredUsers) as! [User], true)
})

如果您对在初始查询后获取新用户/移动用户的更新不感兴趣,这也是通过调用 removeObserverWithFirebaseHandleremoveAllObservers 删除观察者的好时机>.

另请参阅waiting for queries to be 'ready'在 Geofire 文档中。

关于swift - Geofire/Firebase 函数正在快速执行处理程序多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50722753/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com