我想创建一个函数来检查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并查看它是否在主线程中运行.>无论如何,你永远不应该阻止主线程.他们提供了一个异步接口是有充分理由的,因此在调用它时应该使用异步模式.不要对抗异步模式,而是接受它们.