【问题标题】:using variables outside of completion block在完成块之外使用变量
【发布时间】:2016-08-21 17:53:51
【问题描述】:

我目前正在从 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)
        }

    }

【问题讨论】:

  • 你在块外调用 print(self.userBinfos.email) !!把它放在里面: userBinfo { (user) in } 所以它在被块分配之前被调用
  • observeEventType 异步工作,这意味着在 viewDidLoad 完成后稍后调用完成块。把你要执行的代码放到block里面的completion block外面就完成了。

标签: swift firebase firebase-realtime-database


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多