Firestore添加当前用户过滤逻辑后函数异常退出,未向数组添加用户
解决Firestore获取用户时过滤当前用户的问题
嘿,我明白你遇到的问题了——你想在获取用户列表时跳过当前登录用户,但用return直接导致整个函数提前退出,根本没机会添加其他用户对吧?
问题根源
你在for循环里写的if user.uid == uid {return},这里的return会直接终止整个getDocuments的回调闭包,而不是仅仅跳过当前这一次循环迭代。也就是说,只要遇到第一个匹配当前用户的文档,整个回调就结束了,后面的用户都不会被处理,自然users数组就空了。
解决方案1:用continue跳过当前用户
把return换成continue,这样只会跳过当前的循环项,继续处理下一个用户文档:
func fireStoreFetchUsers(){ guard let uid = Auth.auth().currentUser?.uid else { return } let db = Firestore.firestore() db.collection("Users") .getDocuments() { (querySnapshot, err) in if let err = err { print("Error getting documents: \(err)") } else { // 先清空数组,防止重复加载数据 self.users.removeAll() for document in querySnapshot!.documents { let dictionary = document.data() let user = User2(uid: "", distanceFrom: "any", dictionary: dictionary) if user.uid == uid { // 跳过当前登录用户,继续处理下一个 continue } self.users.append(user) } // 所有用户处理完后再刷新UI,避免多次重复刷新 self.collectionView?.reloadData() } } }
更高效的解决方案:在Firestore查询时直接过滤
其实我们可以让Firestore服务器直接返回排除当前用户的数据,不用把所有用户都拉到客户端再过滤,这样更节省带宽和客户端资源:
func fireStoreFetchUsers(){ guard let uid = Auth.auth().currentUser?.uid else { return } let db = Firestore.firestore() db.collection("Users") // 直接在查询阶段排除当前用户的文档 .whereField("uid", isNotEqualTo: uid) .getDocuments() { (querySnapshot, err) in if let err = err { print("Error getting documents: \(err)") } else { self.users.removeAll() for document in querySnapshot!.documents { let dictionary = document.data() let user = User2(uid: "", distanceFrom: "any", dictionary: dictionary) self.users.append(user) } self.collectionView?.reloadData() } } }
额外小提示
- 记得在加载数据前清空
users数组,避免每次调用函数都重复添加旧数据; - 把
collectionView?.reloadData()放在循环外面,不要每次添加一个用户就刷新一次,这样能提升UI性能; - 确保你的
User2初始化方法正确解析了dictionary里的uid字段,不然判断逻辑会失效哦。
内容的提问来源于stack exchange,提问作者user9043410
相关产品推荐
相关产品推荐

