在app委托中下载firebase数据

时间:2016-06-21 14:53:01

标签: ios swift firebase

我已经开始构建一个应用程序,让用户注册并创建一个家庭。现在我正在从登录屏幕下载用户的数据,如果用户已经登录,则从appDelegate下载。但是,当从appDelegate下载用户数据时,我得到的是nil值。

奇怪的是,我在三个视图控制器中都写了以下内容(由选项卡控制器控制):

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

当数据最终从appDelegate下载时,将打印正确的名称。但是,尝试在任何其他时间使用用户变量都会给出nil。

此外,当从登录屏幕下载数据时,它可以完美地工作。对此非常困惑,非常感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我弄清楚出了什么问题。与firebase无关。 在下载用户数据后在app delegate中,我尝试在tabViewController中设置viewControllers的属性。我实际做的是创建每个视图控制器的新实例,设置其属性(这就是为什么didSet属性观察者被触发)但是当设置rootViewController我创建了一个新的tabController实例,我认为然后创建了新的实例三个viewControllers。

这是appDelegate中的旧代码:

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

          }
        }
      })
    }
  }
})

}

这是appDelegate,以及自定义的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
}

我的代码仍然不是很好,但它解决了这个问题。希望它可以帮助你们中的一些人。