gpt4 book ai didi

ios - 当 userID 改变时处理 Firebase 观察者?

转载 作者:搜寻专家 更新时间:2023-11-01 07:04:52 24 4
gpt4 key购买 nike

我在帮助程序类中使用此函数来获取用户的行程。它一直在监听新的变化:

import Foundation
import Firebase

class APICardService: NSObject {
class func fetchTrips(forID userID: String, completion: @escaping ([Trip]) -> Void) {
let path = "users/\(userID)/trips"
Database.database().reference().child(path).queryOrdered(byChild: "timestamp").observe(.value) { (snapshot) in
var trips = [Trip]()
for child in snapshot.children {
if let child = child as? DataSnapshot {
if let dict = child.value as? [String: Any] {
let trip = Trip(key: child.key, dbValues: dict)
trips.append(trip)
}
}
}
completion(trips)
}
}
}

class MyViewController: UIViewController {
// but what if the userID changes? I have no way to stop the current observer and start a new one
internal func fetchCards() {
guard let userID = APIAuthService.getUserID() else { return }
APICardService.fetchTrips(forID: userID) { trips in
self.trips = trips.reversed() // show most recent first
self.addAnnotations(for: trips)
self.collectionView.reloadData()
}
}
}

问题是,每当用户注销并登录到新帐户时,这个观察者仍会监听数据中的新值变化,但它不会工作,因为用户 ID 已更改。我该如何处理?我可以以某种方式删除观察者,但这很复杂,因为我们在一个单独的类中,我不知道如何处理。

最佳答案

在您的类 APICardService 中创建这些全局变量

static var refHandle:DatabaseHandle?  = nil
static var ref:DatabaseReference? = nil

在你的方法中 func fetchTrips(forID userID: String, completion: @escapin

像这样分配全局变量

let path = "users/\(userID)/trips"
ref = Database.database().reference().child(path)
refHandle = ref?.queryOrdered(byChild: "timestamp").observe(.value) { (snapshot) in

现在你有了你的观察者的引用

只需在您的类中添加以下方法

class func removeObserverForFetchTrip() {
if let refHandleValue = refHandle {
ref?.removeObserver(withHandle: refHandleValue)
}
}

用户退出时调用此方法

希望对你有帮助

关于ios - 当 userID 改变时处理 Firebase 观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48719056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com