我正在尝试创建一个在所有应用程序生命周期内保持活动状态的firebase观察者。我想要的是在firebase中更改某些数据时更改tabBarController的属性。这是我的代码:
self.ref.child("mySubRef").observe(.value , with: {snapshot in
self.tabBarController?.tabBar.items?[3].badgeValue = "!"
})
所以,我尝试在我的第一个viewController的viewDidLoad和viewDidAppear中创建它。我不会删除它,因为我希望它始终存在。在viewDidAppear中,只有当我在更改时的viewController中时它才有效。如果我希望无论我在哪里(始终在tabBar中)都要进行更改,我在哪里放置代码?
感谢您的帮助!
答案 0 :(得分:2)
我找到了答案。问题是当我在viewControllers之间进行更改时,对观察者的引用被取消分配。所以,要修复它,我创建了一个这样的类:
class NotificationListener: NSObject {
let ref:FIRDatabaseReference = FIRDatabase.database().reference()
var user:User?
func setUpListener(tabBarController:UITabBarController){
self.user = User()
self.ref.child("users/" + self.user!.uid + "/notifications").observe(.value , with: {snapshot in
tabBarController.tabBar.items?[3].badgeValue = "!"
})
}
}
现在我在每个viewController中都有该类的属性,并且每个都有对同一对象的引用。当我在VC之间切换时,它不会释放该对象,因为它仍然会被引用。
答案 1 :(得分:0)
我认为,您可以使用Appdelegate didFinishLaunchingWithOptions方法,但我不确定。
像这样:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FIRApp.configure()
FIRDatabase.database().reference().child("mySubRef").observe(.value, with: { (snapshot) in
//I'm not sure for this part.
UITabBarController.init().tabBar.items?[3].badgeValue = "!"
})
return true
}