Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 整个应用程序生命周期内的Firebase observer_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 整个应用程序生命周期内的Firebase observer

Ios 整个应用程序生命周期内的Firebase observer,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在尝试创建一个firebase观察器,它在整个应用程序生命周期中都保持活动状态。我想要的是在firebase中的某些数据更改时更改tabBarController的属性。这是我的密码: self.ref.child("mySubRef").observe(.value , with: {snapshot in self.tabBarController?.tabBar.items?[3].badgeValue = "!" }) 因此,我尝试在我的第一个viewC

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

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

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

    })
因此,我尝试在我的第一个viewController的viewDidLoad中以及ViewDidDisplay中创建它。我不移除它,因为我希望它一直在那里。在ViewDidDisplay中,仅当我在更改时处于该viewController中时,它才起作用。如果我希望无论身在何处(总是在选项卡栏中)都能进行更改,那么我必须将代码放在何处


谢谢你的帮助

我认为,您可以使用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
}

我找到了答案。问题是,当我在ViewController之间更改时,对观察者的引用被取消分配。为了解决这个问题,我创建了一个类,如下所示:

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之间切换时,它不会取消分配对象,因为它仍然会被引用。

感谢您的回答,问题是我需要查看控制器提供一些信息(我需要记录用户),是否有任何方法可以从viewController执行此操作?另一种方法是计时器方法。此方法在指定的时间重复操作。如果要对另一个控制器重复操作,请查看此项。不要调用invalidate方法。或者,您可以直接检查用户是否登录了appdelegate。我无法以我的应用程序结构化的方式执行此操作。无论如何,我已经找到了答案,谢谢你的帮助!你能分享答案吗?也许我需要它:)