2016-06-21 6 views
1

私はユーザーが家族にサインアップして作成できるようにするアプリケーションを構築し始めました。今、私はログイン画面からユーザーのデータをダウンロードしています。ユーザーが既にログインしている場合はappDelegateからダウンロードします。ただし、ユーザーデータがappDelegateからダウンロードされたときは、nil値を取得します。データは最終的にappDelegateからのダウンロードが正しい名前が印刷されている場合アプリケーションデリゲートでのfirebaseデータのダウンロード

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

いただきまし奇妙な、私は私の3つのビューコントローラ(タブコントローラによって制御)のそれぞれに以下のように書かれているということです。しかし、他のときにuser変数を使用しようとすると、nilが返されます。

また、ログイン画面からデータをダウンロードすると完全に動作します。これについては非常に混乱し、どんな助けでも大いに感謝します。前もって感謝します。

+0

非同期コールバックを正しく処理していない可能性があります。 –

+0

私は並行プログラミングをしていません。助言がありますか? – jordan

+0

データを取得するFirebase APIは非同期です。質問をより明確にするために、より多くのコードを表示してください。 –

答えて

0

私は何が間違っているかを考え出しました。 firebaseとは関係ありません。 ユーザーデータをダウンロードした後にアプリケーションデリゲートにいる間、私はtabViewController内のviewControllerのプロパティを設定しようとしました。私が実際に行ったことは、各ビューコントローラの新しいインスタンスを作成し、そのプロパティを設定することでした(なぜdidSetプロパティオブザーバが起動したのですか)。その後、rootViewControllerを設定すると、tabControllerの新しいインスタンスが作成されました。 3つのviewController。

これは、古いコードが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 

      } 
     } 
     }) 
    } 
    } 
}) 

}

これは、カスタムTabBarViewControllerとともに、今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) 
} 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 
} 

私はまだコードはありませんが、それは問題を解決しています。それがあなたの一部を助けてくれることを願っています。

関連する問題