2017-04-01 4 views
2

Ich versuche, einen Beobachter zu schaffen, der während des gesamten App-Lebens am Leben bleibt. Ich möchte eine Eigenschaft meines TabBarControllers ändern, wenn sich einige Daten in Firebase ändern. Hier ist mein Code:Firebase-Beobachter während der ganzen App-Lebensdauer

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

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

    }) 

Also, ich habe versucht, es in der viewDidLoad meiner ersten Viewcontroller zu schaffen und auch in der viewDidAppear. Ich entferne es nicht, weil ich möchte, dass es immer da ist. In der ViewDidAppear funktioniert es nur, wenn ich in diesem ViewController im Moment der Änderung bin. Wenn ich möchte, dass diese Änderung eintritt, egal wo ich bin (immer in der TabBar) Wo muss ich diesen Code ablegen?

Danke für die Hilfe!

Antwort

2

Ich habe die Antwort gefunden. Das Problem war, dass wenn ich zwischen ViewControllern wechselte, die Referenz auf den Beobachter freigegeben wurde. Also, um es zu beheben, habe ich eine Klasse wie folgt erstellt:

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 = "!" 

    }) 

} 

} 

Jetzt habe ich eine Eigenschaft dieser Klasse in jedem Viewcontroller und jeder hat einen Verweis auf das gleiche Objekt. Wenn ich zwischen VC wechsle, wird das Objekt nicht freigegeben, da es immer noch referenziert wird.

0

Ich denke, Sie können Appdelegate didFinishLaunchingWithOptions Methode verwenden, aber ich bin mir nicht sicher.

So:

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 
} 
+0

Danke für die Beantwortung, die Sache ist, ich brauche ein paar Informationen von der View-Controller (Ich brauche den Benutzer, um geloggt werden), gibt es eine Möglichkeit, es von der ViewController zu tun? –

+0

Ein anderer Weg Timer-Methode. Diese Methode wiederholt die von Ihnen angegebene Zeit. Sehen Sie sich dieses https://www.hackingwithswift.com/example-code/system/how-to-make-an-action-repeat-using-timer an, wenn Sie Aktionen an einen anderen Controller wiederholen möchten, rufen Sie nicht die invalidate-Methode auf. –

+0

Oder Sie können direkt überprüfen, ob sich der Benutzer im AppDelegate angemeldet hat. –

Verwandte Themen