我想创建一个函数来检查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并查看它是否在主线程中运行.>无论如何,你永远不应该阻止主线程.他们提供了一个异步接口是有充分理由的,因此在调用它时应该使用异步模式.不要对抗异步模式,而是接受它们.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。