我想创建一个函数来检查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。
observeSingleEventOfType
Void
(void)observeSingleEventOfType:(FEventType)eventType withBlock:(void(^)(FDataSnapshot * snapshot))块
错误: Type 'Void' does not conform to protocol 'BooleanLiteralConvertible'
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
在修改后的问题中,您演示了使用调度组使此异步方法同步运行。(信号灯通常也用于相同的目的。)
两个问题:
如果要确认这一点,请临时删除调度组,然后检查NSThread.isMainThread并查看它是否在主线程中运行。
NSThread.isMainThread