Swift技术问题:单例类GetUserData无法触发ViewController函数调用
问题原因及解决方案
核心问题:赋值顺序错误
你在viewDidLoad中先调用observeUserGroupsChanges()启动Firestore监听,之后才给respondToUserGroupsChanges闭包赋值。Firestore的快照监听器会立即触发一次初始快照返回当前集合数据,此时闭包还未赋值(处于nil状态),所以这次触发不会调用ViewController的方法。如果后续你没有对groups集合进行实际的增删改操作,监听器不会再次触发,自然看不到respond的打印。
潜在风险:强引用导致内存泄漏
直接将self.respondToUserGroupsChanges赋值给单例的闭包会让单例强引用ViewController,如果ViewController被销毁(比如用户返回上一页),单例的闭包仍然持有它的引用,造成内存泄漏。
修正代码
- 调整赋值顺序:先给闭包赋值,再启动监听
- 使用弱引用避免循环引用:在闭包中捕获
weak self
class ViewController: UIViewController{ override func viewDidLoad() { // 先赋值闭包,再启动监听 GetUserData.shared.respondToUserGroupsChanges = { [weak self] in self?.respondToUserGroupsChanges() } GetUserData.shared.observeUserGroupsChanges() } func respondToUserGroupsChanges(){ print("respond") } }
验证建议
- 手动修改Firestore中
users/[当前用户ID]/groups下的文档,观察是否打印respond - 检查
currentUserID是否正确,确保监听的是当前用户的目标集合
内容的提问来源于stack exchange,提问作者caa5042
相关产品推荐
相关产品推荐

