【发布时间】:2018-01-06 15:47:39
【问题描述】:
我有以下情况。根控制器是UITabViewController。有一个ProfileViewController,在其中我观察到用户开始成为朋友(然后屏幕功能发生变化)。 ProfileViewController 可以使用 5 个选项卡中的 4 个打开,因此当前用户可以在四个位置与同一用户一起打开屏幕。在以前的版本中,当 ProfileViewController 在一个地方打开时,我在 deinit 中删除了观察者,并仅通过ref.removeAllObservers() 进行删除,现在当用户情况如此时,我开始在 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
}
}
【问题讨论】:
-
所以据我了解,您的代码运行正常,您的问题只是:“有没有比我所做的更好的方法来做到这一点?”如果这是正确的。这是我的反馈。考虑到你所描述的你想要完成的事情,你的逻辑对我来说似乎是合理的。作为对代码的一般反馈点,
observeSpecificUserFriendshipStart可以重构为更具可读性。 -
@Doug 是的,你正确理解了这个问题,我最不喜欢它,我将控制器的链接存储在字典中,所以我想也许有更好的选择)
-
@Doug 在这个变体中,有一个很大的缺点,例如,如果在 deinit 中有删除观察者的任何情况,那么管理器会在字典中获取到控制器的链接。跨度>
标签: ios swift firebase firebase-realtime-database observers