加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:25:45 所属栏目:百科 来源:网络整理
导读:我想创建一个函数来检查user_id是否已经在我的数据库中. class func checkIfUserExsits(uid:String) - Bool { userRef.childByAppendingPath(uid).observeSingleEventOfType(.Value,withBlock: { (snapShot: FDataSnapshot!) - Void in if snapShot.value is
我想创建一个函数来检查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.它定义为返回Void.

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

错误:类型’Void’不符合协议’BooleanLiteralConvertible’

感谢任何帮助.

UPDATE

我正在尝试另一种方式:

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

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

两个问题:

>如果他们将完成处理程序发送回主队列,这将会死锁(在很多情况下,库会这样做以简化我们的生活),因为你巧合地阻止了他们试图使用的同一个线程.我不知道他们在这里做了什么,但很可能.

如果要确认这一点,请暂时删除调度组,然后检查NSThread.isMainThread并查看它是否在主线程中运行.>无论如何,你永远不应该阻止主线程.他们提供了一个异步接口是有充分理由的,因此在调用它时应该使用异步模式.不要对抗异步模式,而是接受它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读