首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当userID改变时,如何处理Firebase观察者?

当userID改变时,如何处理Firebase观察者?
EN

Stack Overflow用户
提问于 2018-02-10 17:03:51
回答 2查看 150关注 0票数 1

我在一个helper类中使用这个函数来获取用户的trips。它一直在监听新的变化:

代码语言:javascript
运行
复制
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()
        }
    }
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-10 19:11:01

在您的类APICardService中创建以下全局变量

代码语言:javascript
运行
复制
static var refHandle:DatabaseHandle?  = nil
static var ref:DatabaseReference? = nil

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

像这样分配全局变量

代码语言:javascript
运行
复制
let path = "users/\(userID)/trips"
ref = Database.database().reference().child(path)
refHandle =  ref?.queryOrdered(byChild: "timestamp").observe(.value) { (snapshot) in

现在,您有了观察者的引用

只需在类中添加以下方法

代码语言:javascript
运行
复制
class func removeObserverForFetchTrip() {
        if let refHandleValue = refHandle {
            ref?.removeObserver(withHandle: refHandleValue)
        }
}

当用户注销时只需调用此方法

希望能对大家有所帮助

票数 1
EN

Stack Overflow用户

发布于 2018-02-10 19:05:18

正如@PrashantTukadiya所说。试着做这样的东西:

代码语言:javascript
运行
复制
struct User {
    var id: String
    ...
}

class UserHolder {
    static var shared: UserHolder = UserHolder() // Singleton

    var currentUser: User? {
        willSet {
            // Remove all the registered firebase handlers associated with the user
            firebaseHandles.forEach({ $0.0.removeObserver(withHandle: $0.1) })
        }
    }

    var firebaseHandles: [(DatabaseReference, UInt)] = []

    // Note: Try to add all the firebase handles you register to "firebaseHandles"
    //   array. The more adequate solution is to make this class register
    //   the listeners, not all other classes.
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48719056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档