所有应用生活中的Firebase观察者

时间:2017-04-01 13:48:23

标签: ios swift firebase firebase-realtime-database

我正在尝试创建一个在所有应用程序生命周期内保持活动状态的firebase观察者。我想要的是在firebase中更改某些数据时更改tabBarController的属性。这是我的代码:

self.ref.child("mySubRef").observe(.value , with: {snapshot in

        self.tabBarController?.tabBar.items?[3].badgeValue = "!"

    })

所以,我尝试在我的第一个viewController的viewDidLoad和viewDidAppear中创建它。我不会删除它,因为我希望它始终存在。在viewDidAppear中,只有当我在更改时的viewController中时它才有效。如果我希望无论我在哪里(始终在tabBar中)都要进行更改,我在哪里放置代码?

感谢您的帮助!

2 个答案:

答案 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
}