ios - 与 Firestore 监听器分离

标签 ios swift firebase google-cloud-firestore

我将 Firestore 与 Swift 结合使用。

我有一个单例数据类 UserManager。我从不同的 ViewControllers 调用它来获取数据来填充我的 TableView 。我希望 TableView 在集合更新时自动更新,因此我需要使用 SnapshotListener。一切正常,但我不确定在关闭 Viewcontroller 时如何与监听器分离。

在单例类中,我有如下所示的方法。该方法提供了一个用户列表,并将从我的应用程序周围的几个不同位置调用。

我还想返回对监听器的引用,以便在关闭 Viewcontroller 时可以与它分离。但我无法让它工作。下面的解决方案给出了编译器错误。

我一直在尝试查看引用资料,例如这里 https://firebase.google.com/docs/firestore/query-data/listen但是当数据加载到单例类中而不是直接加载到 Viewcontroller 中时,我需要让它工作。去这里的路是什么?

在用户管理器中:

func allUsers(completion:@escaping ([User], ListenerRegistration?)->Void) {
    let listener = db.collection("users").addSnapshotListener { querySnapshot, error in
        if let documents = querySnapshot?.documents {
            var users = [User]()
            for document in documents {
                let user = User(snapshot: document)
                users.append(user)
            }
            completion(users, listener)
        }
    }
}

在 View Controller 中:

override func viewDidLoad() {
    super.viewDidLoad()
    UserManager.shared.allUsers(completion: { (users, listener) in
        self.users = users
        self.listener = listener
        self.tableView.reloadData()
    })
}

deinit {
    self.listener.remove()
}

最佳答案

猜想您看到的编译器错误是指您在其自己的定义上下文中使用listener

试试这个来改变:

在用户管理器中:

func allUsers(completion:@escaping ([User])->Void) -> ListenerRegistration? {
    return db.collection("users").addSnapshotListener { querySnapshot, error in
        if let documents = querySnapshot?.documents {
            var users = [User]()
            for document in documents {
                let user = User(snapshot: document)
                users.append(user)
            }
            completion(users)
        }
    }
}

在 View Controller 中:

override func viewDidLoad() {
    super.viewDidLoad()
    self.listener = UserManager.shared.allUsers(completion: { (users) in
        self.users = users
        self.tableView.reloadData()
    })
}

deinit {
    self.listener.remove()
}

关于ios - 与 Firestore 监听器分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716670/

相关文章:

swift - 如何在 SwiftUI 中延迟动画?

android - 通过复制一些数据 android 重新创建一个 firebase 对象

html - iOS 中的 Jquery Mobile 滚动和标题问题

ios - UICollectionViewCell 高度基于标签大小

ios - ARKit 和 3D 对象/图像识别

ios - 如何设置 UITextField 的字母间距

ios - 快速清除 JSON 缓存?

Swift:如何检查对象的核心数据 NSSet

android - 如何从 FCM token 获取 Firebase 用户 ID? (在服务器上的管理员代码中)

firebase - iOS 14 WidgetKit + SwiftUI + Firebase?