You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift技术问题:单例类GetUserData无法触发ViewController函数调用

问题原因及解决方案

核心问题:赋值顺序错误

你在viewDidLoad中先调用observeUserGroupsChanges()启动Firestore监听,之后才给respondToUserGroupsChanges闭包赋值。Firestore的快照监听器会立即触发一次初始快照返回当前集合数据,此时闭包还未赋值(处于nil状态),所以这次触发不会调用ViewController的方法。如果后续你没有对groups集合进行实际的增删改操作,监听器不会再次触发,自然看不到respond的打印。

潜在风险:强引用导致内存泄漏

直接将self.respondToUserGroupsChanges赋值给单例的闭包会让单例强引用ViewController,如果ViewController被销毁(比如用户返回上一页),单例的闭包仍然持有它的引用,造成内存泄漏。


修正代码

  1. 调整赋值顺序:先给闭包赋值,再启动监听
  2. 使用弱引用避免循环引用:在闭包中捕获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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:38:30