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’不符合协议’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并查看它是否在主线程中运行.>无论如何,你永远不应该阻止主线程.他们提供了一个异步接口是有充分理由的,因此在调用它时应该使用异步模式.不要对抗异步模式,而是接受它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |