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

Swift可以从异步Void返回块返回值吗?

龙新荣
2023-03-14
问题内容

我想创建一个函数来检查user_id是否已在我的数据库中。

class func checkIfUserExsits(uid:String) -> Bool {
    userRef.childByAppendingPath(uid).observeSingleEventOfType(.Value, withBlock: { (snapShot: FDataSnapshot!) -> Void in
                if snapShot.value is NSNull {
                    return false
                } else {
                    return true
                }
    })
}

但是,observeSingleEventOfType是第三方Firebase提供的API。它定义为return Void

  • (void)observeSingleEventOfType:(FEventType)eventType
    withBlock:(void(^)(FDataSnapshot * snapshot))块


错误: Type 'Void' does not conform to protocol 'BooleanLiteralConvertible'

感谢任何帮助。

更新

我正在尝试另一种方式:

class func checkIfExist(uid: String) -> Bool {
    var answer:Bool = false
    var text:String = "not yet completed"
    let queue = dispatch_group_create()
    dispatch_group_enter(queue)
        userRef.childByAppendingPath(uid).observeSingleEventOfType(.Value, withBlock: { (snapShot: FDataSnapshot!) -> Void in
                if snapShot.value is NSNull {
                    text = "This is a new user"
                    answer  = false
                    dispatch_group_leave(queue)
                } else {
                    text = "Found the user in Firebase"
                    answer = true
                    dispatch_group_leave(queue)
                }
        })
    dispatch_group_wait(queue, DISPATCH_TIME_FOREVER)
    println(text)
    return answer
}

不知何故,它在那里冻结了。我知道这种方法现在可能不合时宜。但是请帮忙。


问题答案:

您应该自己使用异步完成处理程序:

class func checkIfUserExists(uid: String, completionHandler: (Bool) -> ()) {
    userRef.childByAppendingPath(uid).observeSingleEventOfType(.Value) { snapShot in
        if snapShot.value is NSNull {
            completionHandler(false)
        } else {
            completionHandler(true)
        }
    }
}

然后可以这样调用:

MyClass.checkIfUserExists(uid) { success in
    // use success here
}

// but not here

修改后的问题中,您演示了使用调度组使此异步方法同步运行。(信号灯通常也用于相同的目的。)

两个问题:

  1. 如果他们将完成处理程序分派回主队列,这将导致死锁(在许多情况下,库将这样做以简化我们的工作),因为您恰巧阻塞了他们试图使用的同一线程。我不知道这是否是他们在这里所做的,但很有可能。

如果要确认这一点,请临时删除调度组,然后检查NSThread.isMainThread并查看它是否在主线程中运行。

  1. 无论如何,您永远都不应阻塞主线程。他们提供了一个异步接口是有充分的理由的,因此在调用它时应该使用异步模式。不要对抗异步模式,而应该拥抱它们。


 类似资料:
  • 问题内容: 我正在编写一个函数,该函数采用groupchatID(字符串),并为该群聊返回收件人列表([String])。我正在努力与功能的异步部分。当我运行该函数时,它将正确地将我要查找的用户名数组打印到控制台。虽然,当我调用该函数并尝试打印返回的值时,它始终是一个空数组,因为该函数会在Firebase调用完成之前返回该数组。我正在尝试使用回调,但是我不太了解所有语法。请看一下,让我知道需要更改

  • 问题内容: 请看下面的代码: 我想从异步块返回一个值。我不需要任何完成处理程序或任何其他解决方法。 问题答案: 就像@rmaddy所说的那样,除了使用完成处理程序,您别无选择。 您可以这样调用方法。

  • 问题内容: 我如何才能使此代码返回值 而不冻结浏览器 。 您当然可以用新方法重写它。 编辑: 我需要至少在其他时间从php文件中获取20个变量。 问题答案: 这是不可能的。 Javascript在UI线程上运行;如果您的代码等待服务器回复,则浏览器必须保持冻结状态。 相反,您需要使用回调返回值: 请注意,这两个回调将以不可预测的顺序运行。 您应该修改设计,以便可以在单个AJAX请求中获得所有二十个

  • 问题内容: 我在互联网上读过有关回调的信息,但就我而言我还是听不懂。 我具有此功能,并且在运行时会记录到控制台。但是,现在我需要在另一个功能中使用此响应,而我正在努力做到这一点。 这是我应该得到的地方:(这显然不起作用,因为它不等待响应。) 我真的很难把头放在回调上,我在这里盯着自己瞎了。 问题答案: 回调无法返回值,因为它们将要返回的代码已经执行。 因此,您可以做几件事。一个传递回调函数,异步函

  • 问题内容: 所以我有一个来自Parse的PFFile对象,并且我试图创建一个函数来检索该PFFile的UIImage表示并将其返回。就像是: 但是,这里的问题很明显。我每次都会得到nil,因为getDataInBackroundWithBlock函数是异步的。有什么方法可以等到检索到UIImage之后再返回image变量?我不知道在这种情况下使用同步getData()是否有效。 问题答案: 是的,

  • 问题内容: 在SO中多次问过这个问题。但是我还是收不到东西。 我想从回调中获得一些价值。请看下面的脚本进行澄清。 如果我尝试返回该值,则只是“未定义”。我遵循了SO的一些想法,但仍然失败。 那些是: 问题答案: 这是不可能的,因为您无法从同步方法内部的异步调用返回。 在这种情况下,您需要将回调传递给foo,该回调将接收返回值 问题是,如果内部函数调用是异步的,则所有“包装”此调用的函数也必须是异步