作者:JayantKwon | 来源:互联网 | 2023-05-22 21:44
我想创建一个函数来检查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
错误: Type 'Void' does not conform to protocol '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
}
不知怎的,它只是冻结在那里.我知道这种方法现在可能是偏离主题的.但请帮忙.
1> Rob..:
您应该自己使用异步完成处理程序:
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`如果要确认.但是,我再次强烈建议不要阻止主线程,因为你不太习惯使用闭包和异步模式.