【问题标题】:Downloading firebase data in the app delegate在应用程序委托中下载 Firebase 数据
【发布时间】:2016-06-21 14:53:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可能没有正确处理异步回调。
  • 我没有按原样进行任何并发编程。有什么建议吗?
  • 获取数据的 Firebase API 是异步的。显示更多代码以使问题更清晰。

标签: ios swift firebase


【解决方案1】:

我知道出了什么问题。与火力无关。 在下载用户数据后的应用程序委托中,我尝试在我的 tabViewController 中设置 viewControllers 的属性。我实际上所做的是为每个视图控制器创建一个新实例,设置它的属性(这就是为什么 didSet 属性观察器被触发)但是当设置 rootViewController 我创建了一个 tabController 的新实例,我认为它创建了新的实例三个视图控制器。

这是 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
          }
        }
      })
    }
  }
})
}

标签栏控制器:

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
}

我的代码仍然不是很好,但它已经解决了问题。希望对你们中的一些人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多