我在使用此 Swift 函数时遇到问题,虽然我确信解决方案相当简单,但我无法弄清楚哪里出了问题。这是代码:
static func isArtist(user:FIRUser) -> Bool? {
var artist: Bool?
database.child("users").child(user.uid).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
artist = true //retrieves bool, simplified for example
}) { (error) in
print("isArtist - data could not be retrieved - EXCEPTION: " + error.localizedDescription)
}
return artist
}
该函数每次都返回 nil
,而逻辑上我认为它会返回 true
。这是嵌套函数的问题吗?如何在嵌套函数中返回内容?数据库是 Swift Firebase SDK 的实现,如果无法检索到此类对象(对于本例,如果 artist
为 nil),该函数应该只返回 nil。谢谢。
最佳答案
使用 completionBlock:
来处理你的情况,这将返回一个 nil
的原因是因为你已经声明了你的 artist
变量为 optional
,它需要一些时间从任何后端(异步调用)检索数据,因此甚至在您可以从数据库检索一些值之前执行 return artist
:-
使用:-
static func isArtist(user:FIRUser, completionBlock : ((isArtistBool : Bool)-> Void)) {
database.child("users").child(user.uid).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
completionBlock(isArtistBool : true) //returns Bool in completionHnadler
}) { (error) in
print("isArtist - data could not be retrieved - EXCEPTION: " + error.localizedDescription)
}
}
当您调用函数 isArtist
时:-
isArtist(FIRAuth.auth()!.currentUser, completionBlock : {(isArtistBool) in
//Will return `isArtistBool` in completionHandler
..//rest of the code
})
关于swift - 嵌套 Bool 总是返回 Nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985066/