繁体   English   中英

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

[英]Remove the observer using the handle in Firebase in Swift

我有以下情况。 根控制器是UITabViewController 有一个ProfileViewController ,在其中使我成为观察者,使用户开始成为朋友(然后屏幕功能发生了变化)。 可以使用5个标签中的4个打开ProfileViewController ,因此当前用户可以在四个位置与同一用户一起打开屏幕。 在以前的版本中,当ProfileViewController在一个位置打开时,我删除了deinit中的观察者,并仅通过ref.removeAllObservers()进行了删除,现在,在这种情况下,我开始在viewDidDisappear中使用handle和delete Observer。 我想演示代码以找出是否可以改进以及在这种情况下我是否做对了。

我在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仅存在这些侦听器之一。 我会让监听器在视图控制器上引用一个变量。

这样,所有内容都只包含在viewController中。 如果其他类型的viewController将执行类似类型的侦听器管理,则它也可能是创建协议的良好候选者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM