2016-08-21 12 views
1

現在、firebaseからデータを取得していますが、データはNSObjectに格納され、その後に完了ブロックに格納されます。完了ブロック内の項目は変数userBinfosとして格納されます。 userBinfosのみ完了ブロックの内部で作業変数iが完了完成ブロック外の変数を使用

var userBinfos = userObject() 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     userBinfo { (user) in 
     self.userBinfos = user 

     } 
//I want to use to variable here but it does not work 
     print(self.userBinfos.email) 

    } 


    func userBinfo(completion: (userObject) ->()) { 

     let dbFir = FIRDatabase.database().reference() 

     let firRef = dbFir.child("frontEnd/users/\(userId)") 

     firRef.observeEventType(.Value, withBlock: { snapshot in 

      let userDict = snapshot.value as! [String: AnyObject] 
      self.name.text = userDict["firstname"] as? String 
      self.userBio.text = userDict["userBio"] as! String 

      var user = userObject() 

      user.firstName = userDict["firstname"] 
      user.lastName = userDict["lastname"] 
      user.email = userDict["email"] 
      user.profileImageUrl = userDict["profileImageUrl"] 
      user.userBio = userDict["firstname"] 
      user.userId = userDict["firstname"] 

        dispatch_async(dispatch_get_main_queue(), { 
      completion(user) 

      }) 

     }) { (error) in 
      print(error) 
     } 

    } 
+2

ブロック外でprint(self.userBinfos.email)を呼び出すとします。それはブロックによって割り当てられる前に呼び出されています。 – Jad

+1

'observeEventType'は非同期に動作します。これは、' viewDidLoad'が完了した後で完了ブロックが後で呼び出されることを意味します。実行したいコードをブロック内の完了ブロックの外に置き、完了します。 – vadian

答えて

1

userBinfocompletionパラメータの全体の目的は、非同期observeEventTypeが呼び出されたときに通知されるためのメカニズムを提供することであると、この外側を使いたいです。したがって、非同期メソッドの内部でuserBinfo { user in ... }クロージャの完了を条件にコードを置きます。

そして、その非同期completionクロージャが呼び出されるまで、UIの一部が意味をなさない場合、viewDidLoadはそれを明示的にするためにUIを構成する(おそらくUIActivityIndicatorViewまたは何を示している)、その後、完了ハンドラ内でその原料を削除しています。

override func viewDidLoad() { 
    super.viewDidLoad() 

    // do whatever you want to let the user know that something asynchronous 
    // is happening, e.g. add a spinning `UIActivityIndicatorView` or whatever 

    userBinfo { user in 
     self.userBinfos = user 

     // Update the UI here, including removing anything we presented to let 
     // the user know that the asynchronous process was underway. If you were 
     // dealing with UITableView`, you'd call `tableView.reloadData()` here. 
    } 

    // but not here 
} 
関連する問題