2016-06-21 3 views
1

사용자가 가족을 등록하고 만들 수있는 앱을 만들기 시작했습니다. 지금은 로그인 화면에서 사용자 데이터를 다운로드하고, 사용자가 이미 로그인 한 경우 appDelegate에서 다운로드합니다. 그러나 appDelegate에서 사용자 데이터를 다운로드 할 때 값이 0이됩니다.앱 대리인의 firebase 데이터 다운로드

은 무슨 이상한 것은 내가 (탭 컨트롤러에 의해 제어) 내 세 개의 뷰 컨트롤러의 각에 기록 된 다음 한 것입니다 :

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

AppDelegate에에서 결국 데이터 다운로드가 올바른 이름이 인쇄됩니다. 그러나 다른 시간에 user 변수를 사용하려고하면 nil이 반환됩니다.

또한 로그인 화면에서 데이터를 다운로드하면 완벽하게 작동합니다. 이것에 대해 매우 혼란 스러우며 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

+0

비동기 콜백을 올바르게 처리하지 못할 수 있습니다. –

+0

나는 동시 프로그래밍을하고 있지 않다. 어떤 제안? – jordan

+0

데이터를 가져 오는 Firebase API는 비동기입니다. 질문을 명확하게하기 위해 더 많은 코드를 보여주십시오. –

답변

0

나는 무엇이 잘못되었는지 알아 냈습니다. 파이어베이스와는 아무 관련이 없습니다. 사용자 데이터를 다운로드 한 후 응용 프로그램 대리인이있는 동안 tabViewController에서 viewControllers의 속성을 설정하려고했습니다. 내가 실제로 한 일은 각 뷰 컨트롤러의 새 인스턴스를 만들고 그 속성을 설정하는 것이 었습니다. (그래서 didSet 속성 옵저버가 실행 된 것입니다.)하지만 rootViewController를 설정할 때 tabController의 새 인스턴스를 만들었습니다. 3 개의 viewController.

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 :

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에 있습니다 :

이 이전 코드는 AppDelegate에 있었다 무엇인가

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 
} 

코드는 여전히 훌륭하지만 문제가 해결되었습니다. 희망이 당신을 도와줍니다.

관련 문제