ios - 在 Swift 中使用 Firebase 中的句柄删除观察者

标签 ios swift firebase firebase-realtime-database observers

我有以下情况。根 Controller 是 UITabViewController。有一个 ProfileViewController,我在里面做了一个观察者,用户开始成为 friend (然后屏幕功能发生变化)。 ProfileViewController 可以用 5 个选项卡中的 4 个选项卡打开,因此当前用户可以在四个位置用同一用户打开屏幕。在以前的版本中,当ProfileViewController在一个地方打开时,我在deinit中删除了观察者并通过ref.removeAllObservers()删除,现在当用户情况是这样时,我开始使用handle和delete viewDidDisappear 中的观察者。我想演示一下代码,看看它是否可以改进,以及我在这种情况下是否做得对。

我在 viewWillAppear 中调用这个函数

   fileprivate func firObserve(_ isObserve: Bool) {
        guard let _user = user else { return }
        FIRFriendsDatabaseManager.shared.observeSpecificUserFriendshipStart(observer: self, isObserve: isObserve, userID: _user.id, success: { [weak self] (friendModel) in
        }) { (error) in

        }
    }

这是在 FIRFriendsDatabaseManager 中

fileprivate var observeSpecificUserFriendshipStartDict = [AnyHashable : UInt]()


func observeSpecificUserFriendshipStart(observer: Any, isObserve: Bool, userID: String, success: ((_ friendModel: FriendModel) -> Void)?, fail: ((_ error: Error) -> Void)?) {
        let realmManager = RealmManager()
        guard let currentUserID = realmManager.getCurrentUser()?.id else { return }
        DispatchQueue.global(qos: .background).async {
            let specificUserFriendRef = Database.database().reference().child(MainGateways.friends.description).child(currentUserID).child(SubGateways.userFriends.description).queryOrdered(byChild: "friendID").queryEqual(toValue: userID)

            if !isObserve {
                guard let observerHashable = observer as? AnyHashable else { return }
                if let handle = self.observeSpecificUserFriendshipStartDict[observerHashable] {
                    self.observeSpecificUserFriendshipStartDict[observerHashable] = nil
                    specificUserFriendRef.removeObserver(withHandle: handle)
                    debugPrint("removed handle", handle)
                }
                return
            }

            var handle: UInt = 0

            handle = specificUserFriendRef.observe(.childAdded, with: { (snapshot) in
                if snapshot.value is NSNull {
                    return
                }
                guard let dict = snapshot.value as? [String : Any] else { return }
                guard let friendModel = Mapper<FriendModel>().map(JSON: dict) else { return }

                if friendModel.friendID == userID {
                    success?(friendModel)
                }
            }, withCancel: { (error) in
                fail?(error)
            })

            guard let observerHashable = observer as? AnyHashable else { return }
            self.observeSpecificUserFriendshipStartDict[observerHashable] = handle
        }
    }

最佳答案

关于维护对每个 viewController 的引用的实现,我会考虑将逻辑移动到 viewController 本身的扩展。

如果您想避免像以前那样调用 ref.removeAllObservers(),并假设每个 viewController 只有其中一个监听器。我会让 listener ref 成为 View Controller 上的一个变量。

这样一切都包含在 viewController 中。如果其他类型的 viewController 将执行类似类型的监听器管理,它也可能是创建协议(protocol)的良好候选者。

关于ios - 在 Swift 中使用 Firebase 中的句柄删除观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45409657/

相关文章:

ios - Alamofire 参数未正确序列化

ios - 根据分辨率调整图像大小

ios - 如何检查给定字符位于 Swift 3.0 中的 A 到 Z 之间?

javascript - 测试 AngularFireAuth Wrapper,不使用 AngularFireAuth 模拟

ios - 如何为 iOS 的 FirebaseUI 登录添加背景图片?

swift - JSQMessagesViewController 设置收件人 firebase id

iOS:创建另一个 UIWindow 作为覆盖时出现问题(iOS 7 问题?)

ios - 在 UIPickerView 出现之前加载数据

ios - 仅水平滚动图像的登录页面

swift - 在 Xcode 中使用整洁的 swift 架构的注册页面出现问题