2016-08-21 36 views
1

我目前正在從firebase檢索數據,數據放入NSObject,然後是完成塊。完成塊內的項目存儲爲變量userBinfos。可變userBinfos只完成塊的內部工作,我想使用完成使用完成塊以外的變量

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)以外的塊!把它放在裏面:userBinfo {(user)in },所以它在塊被分配之前被調用 – Jad

+1

'observeEventType'異步工作,這意味着完成塊在'viewDidLoad'完成後調用。將要執行的代碼放在塊中的完成塊外面,然後完成。 – vadian

回答

1

userBinfocompletion參數的整個目的是爲在異步observeEventType被稱爲被告知提供一種機制,這種外。所以把代碼視乎完成異步方法內部關閉userBinfo { user in ... }

而如果用戶界面的一部分,沒有任何意義,直到異步completion關閉被調用,那麼有viewDidLoad配置用戶界面做出明確的(也許是顯示一個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 
}