【问题标题】:Detach from Firestore listener从 Firestore 侦听器中分离
【发布时间】:2018-11-15 22:03:45
【问题描述】:

我将 Firestore 与 Swift 一起使用。

我有一个单例数据类 UserManager。我从不同的 ViewController 中调用它来获取数据以填充我的 tableviews。我希望表视图在更新集合时自动更新,所以我需要使用 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)
        }
    }
}

在 ViewController 中:

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()
}

【问题讨论】:

  • 你能发布你的编译器错误吗?

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

我认为 getDocument 而不是 addSnapshotListener 是您正在寻找的。 使用此方法,侦听器会在请求结束时自动分离... 这将类似于

 func allUsers(completion:@escaping ([User])->Void) {
 db.collection("users").getDocument { 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)
     }
 } }

【讨论】:

  • 谢谢!但是我需要使用 addSnapshotListener,因为我希望 tableviews 在集合更新时自动更新。我遇到的问题是将侦听器返回给视图控制器,以便以后可以将其删除。我用更多细节更新了我的问题
【解决方案2】:

猜想您看到的编译器错误是指您将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)
        }
    }
}

在 ViewController 中:

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

deinit {
    self.listener.remove()
}

【讨论】:

  • 正是我需要解决的相同问题。有一段时间我想也许我有一个胭脂 viewController 在我的 navigationController 堆栈或其他东西中被复制。对于我的应用程序,当侦听器检测到变化时它会发出一声短促的哔哔声,因此很明显,同时有多个哔哔声发生了一些事情,哈哈。谢谢!
  • 我被困在“ListenerRegistration”的类型上,所以这有帮助。这在任何地方都有记录吗?
猜你喜欢
  • 2021-07-12
  • 2019-02-03
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
相关资源
最近更新 更多