2016-06-21 26 views
1

Ich habe damit begonnen, eine App zu erstellen, mit der sich ein Benutzer anmelden und eine Familie erstellen kann. Im Moment lade ich die Daten für den Benutzer vom Anmeldebildschirm herunter und lade von der App Delegate, wenn der Benutzer bereits angemeldet ist. Wenn die Benutzerdaten jedoch von der AppDelegate heruntergeladen werden, bekomme ich keine Werte.Herunterladen von Firebase-Daten im App-Delegaten

Was seltsam ist, dass ich in jedem meiner drei View-Controller (gesteuert durch eine Registerkarte Controller) folgendes geschrieben haben:

var user: User? { 
didSet { 
    print(user!.name!) 
} 
} 

Wenn die Daten schließlich Downloads aus dem AppDelegate der richtige Name gedruckt wird. Wenn Sie jedoch versuchen, die Benutzervariable zu einem anderen Zeitpunkt zu verwenden, wird Null ausgegeben.

Auch wenn die Daten vom Anmeldebildschirm heruntergeladen werden, funktioniert es perfekt. Sehr verwirrt darüber und würde jede Hilfe sehr schätzen. Danke im Voraus.

+0

Möglicherweise bearbeiten Sie die asynchronen Rückrufe nicht korrekt. –

+0

Ich mache keine gleichzeitige Programmierung wie es ist. Irgendwelche Vorschläge? – jordan

+0

Die Firebase-APIs, die Daten abrufen, sind asynchron. Zeigen Sie mehr von Ihrem Code, um die Frage klarer zu machen. –

Antwort

0

Ich habe herausgefunden, was los war. Nichts mit Firebase zu tun. Während ich im App-Delegaten nach dem Herunterladen der Benutzerdaten war, habe ich versucht, die Eigenschaften des ViewControllers in meinem TabViewController festzulegen. Was ich tatsächlich getan habe, war eine neue Instanz jedes View-Controllers zu erstellen, seine Eigenschaften einzustellen (weshalb die didSet-Eigenschaft observer ausgelöst hat), aber dann habe ich beim Setzen von rootViewController eine neue Instanz des tabControllers erstellt, von der ich glaube, dass sie dann neue Instanzen des drei ViewController.

Dies ist, was der alte Code im AppDelegate war:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
FIRApp.configure() 
let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
if let user = FIRAuth.auth()?.currentUser { 
    downloadUserData(user) 
    self.window?.rootViewController = storyBoard.instantiateViewControllerWithIdentifier("Home") 
} else { 
    window?.rootViewController = storyBoard.instantiateViewControllerWithIdentifier("SignIn") 
} 

return true 
} 

func downloadUserData(user: FIRUser) { 
let ref = FIRDatabase.database().reference() 

ref.child("users").queryOrderedByKey().queryEqualToValue(user.uid).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
    for child in snapshot.children { 
    if let name = child.value!["name"] as? String, let familyID = child.value!["signedInTo"] as? String { 
     self.user = User(uid: user.uid, name: name) 
     ref.child("families").queryOrderedByKey().queryEqualToValue(familyID).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
     for child in snapshot.children { 
      if let name = child.value!["name"] as? String { 
      self.family = Family(uid: familyID, name: name) 

      let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
      let tabVC = storyBoard.instantiateViewControllerWithIdentifier("Home") as? TabBarViewController 
      tabVC?.user = self.user 
      tabVC?.family = self.family 

      let choresNav = tabVC?.viewControllers![0] as? UINavigationController 

      let choresVC = choresNav?.topViewController as? ChoresViewController 

      choresVC?.user = self.user 
      choresVC?.family = self.family 

      } 
     } 
     }) 
    } 
    } 
}) 

}

Dies ist AppDelegate jetzt, zusammen mit einem benutzerdefinierten TabBarViewController

:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
FIRApp.configure() 
let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
if let user = FIRAuth.auth()?.currentUser { 
    downloadUserData(user) 
} else { 
    window?.rootViewController = storyBoard.instantiateViewControllerWithIdentifier("SignIn") 
} 
return true 
} 

func downloadUserData(user: FIRUser) { 
let ref = FIRDatabase.database().reference() 

ref.child("users").queryOrderedByKey().queryEqualToValue(user.uid).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
    for child in snapshot.children { 
    if let name = child.value!["name"] as? String, let familyID = child.value!["signedInTo"] as? String { 
     self.user = User(uid: user.uid, name: name) 
     ref.child("families").queryOrderedByKey().queryEqualToValue(familyID).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
     for child in snapshot.children { 
      if let name = child.value!["name"] as? String { 
      self.family = Family(uid: familyID, name: name) 

      let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
      let tabVC = storyBoard.instantiateViewControllerWithIdentifier("Home") as? TabBarViewController 
      tabVC?.user = self.user 
      tabVC?.family = self.family 
      self.window?.rootViewController = tabVC 
      } 
     } 
     }) 
    } 
    } 
}) 
} 

TabBarController:

var user: User? 
var family: Family? 

override func viewDidLoad() { 
super.viewDidLoad() 
print(user?.name) 
print(family?.name) 

let navVC = self.viewControllers![0] as? UINavigationController 
let itemsNav = self.viewControllers![1] as? UINavigationController 
let leaderNav = self.viewControllers![2] as? UINavigationController 

let choresVC = navVC!.topViewController as? ChoresViewController 
let itemsVC = itemsNav!.topViewController as? ShoppingListViewController 
let leaderVC = leaderNav!.topViewController as? LeaderBoardViewController 

choresVC?.user = self.user 
choresVC?.family = self.family 

itemsVC!.user = self.user 
itemsVC!.family = self.family 

leaderVC!.user = self.user 
leaderVC!.family = self.family 
} 

Der Code, den ich noch habe, ist nicht großartig, aber es hat das Problem gelöst. Ich hoffe, es hilft einigen von euch.

Verwandte Themen