当前位置: 首页 > 面试题库 >

在完成块之外使用变量

胡承悦
2023-03-14
问题内容

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

    }

问题答案:

completion参数的全部目的userBinfo是提供一种机制,用于在异步observeEventType调用时得到通知。因此,将代码取决于闭包
内部 该异步方法的完成情况userBinfo { user in ... }

而且,如果在completion调用异步关闭之前UI的一部分没有意义,则需要viewDidLoad配置UI使其显式(也许显示a
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
}


 类似资料:
  • 我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种

  • 问题内容: 我有以下代码 现在,测试var应该像控制台那样将false设置为true。但是test var给了我不确定的原因? 问题答案: 可能是因为Validate.fail(test)在异步调用之后立即发生。请记住,它是异步的,这意味着它与页面上运行的javascript并行执行。

  • 我不完全确定这在Java中是否可行,但在if语句中声明的字符串之外,如何使用if语句中声明的字符串呢?

  • 问题内容: 在回调函数之外使用全局变量的最佳方法是什么? 问题答案: 您提供的代码是完全有效的,并且实际上 可以 “保持”其价值。问题可能是异步运行的-仅 在 从服务器完全加载后才调用匿名函数。因此,现实世界中的执行顺序如下所示: 调用 (开始加载data.xml) 通话(目前仍为null) (data.xml中完成载入) 现在 匿名函数被调用时,其分配值给图标:。 如果你想要做一些事情的价值,

  • 基于UIView的block的动画允许你在动画结束的时候提供一个完成的动作。CATranscation接口提供的+setCompletionBlock:方法也有同样的功能。我们来调整上个例子,在颜色变化结束之后执行一些操作。我们来添加一个完成之后的block,用来在每次颜色变化结束之后切换到另一个旋转90的动画。代码见清单7.3,运行结果见图7.2。 清单7.3 在颜色动画完成之后添加一个回调 -

  • 问题内容: 我创建了一个活动,在其中将一些记录插入到mysql数据库中。我声明了一个名为的全局变量。当我尝试方法内部的变量时,工作正常,但是当我尝试方法外部时,返回。我还需要在方法之外使用此变量。该怎么办?这是我的代码: 谢谢! 问题答案: 我知道了。大约一年后,我回答了这个问题,因为我看到这个帖子有几百位访客。希望我的回答将帮助其他功能访问者从onResponse方法获取数据。这是代码: 这是我