Ich möchte eine Funktion erstellen, um zu überprüfen, ob user_id bereits in meiner Datenbank ist.Kann der Swift-Wert von einem Async-Void-Returning-Block zurückgegeben werden?
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
}
})
}
Allerdings ist observeSingleEventOfType
eine API von 3rd-Party-Firebase zur Verfügung gestellt. Es ist definiert, dass Void
zurückgegeben wird.
- (void)observeSingleEventOfType:(FEventType)eventType withBlock:(void (^) (FDataSnapshot *snapshot))block
Fehler: Type 'Void' does not conform to protocol 'BooleanLiteralConvertible'
schätzen irgendeine Art hilft.
UPDATE
ich eine andere Art und Weise versuchen:
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
}
Irgendwie einfrieren einfach da. Ich weiß, dass dieser Ansatz jetzt off-topic sein könnte. Aber bitte hilf mir.
Danke. Ich frage mich, ob es eine andere weniger wortreiche Möglichkeit gibt, es zu tun. Ich mag es nicht, wenn mein Projekt in vollständigen Blöcken in vollständigen Blöcken verschachtelt ist. –
Vielen Dank Rob. Ich weiß, dass ich es wahrscheinlich falsch mache, aber ich möchte es trotzdem versuchen. Wie du schon sagtest, versuche ich das Feature zu disasyn. Semaphore kenne ich nicht. Ich habe stattdessen versucht, dispactch_group_wait zu verwenden. Bitte sehen Sie das Update meiner Frage. –
Wenn sie ihren Vervollständigungshandler zurück in die Hauptwarteschlange schicken (und in vielen Fällen werden Bibliotheken dies tun, um das Leben für uns zu vereinfachen), blockieren Sie den Hauptthread und warten darauf, dass die Bibliothek den Vervollständigungshandler an die Derselbe Thread, den du blockierst. Ich weiß nicht, ob sie das hier gemacht haben, aber wahrscheinlich. Entfernen Sie vorübergehend die Dispatch-Gruppe und untersuchen Sie dann "NSThread".isMainThread "wenn Sie bestätigen möchten. Aber wiederum würde ich energischer davon abraten, den Hauptthread zu blockieren, nur weil Sie weniger komfortabel mit Closures und asynchronen Mustern arbeiten. – Rob