【发布时间】:2017-06-18 12:00:14
【问题描述】:
我有一个函数,里面有 2 个 if 语句。代码:
func pictureFromFirebase(loginMethod: Int)
{
if loginMethod == 0 //FB
{
var profilePic = FBSDKGraphRequest(graphPath: "me/picture", parameters: ["height":300, "width":300, "redirect":false], httpMethod: "GET")
let profilePicRef = storageRef.child((user?.uid)!+"/profile_pic.jpg")
profilePicRef.data(withMaxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
// Uh-oh, an error occurred!
} else {
if (data != nil)
{
print("no need to download image from facebook")
self.profileImage.image = UIImage (data: data!)
}
}
}
if profileImage.image == nil
{
print("downloading image from facebook")
profilePic?.start(completionHandler: {(_ connection, _ result, _ error) -> Void in
if (error == nil)
{
if let dictionary = result as? [String:Any], let data = dictionary["data"] as? [String:Any],
let urlPic = data["url"] as? String {
if let imageData = NSData(contentsOf: NSURL(string: urlPic)! as URL)
{
let uploadTask = profilePicRef.put(imageData as Data, metadata: nil){
metadata, error in
if (error == nil)
{
let downloadUrl = metadata!.downloadURL
}
else
{
print("error in downloading image")
}
}
self.profileImage.image = UIImage(data: imageData as Data)
}
}
}
})
}
}
}
只有当这个函数被触发时才会被调用:
FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
print("called")
if let user = user {
if(activeUser != user){
let name = user.displayName
self.profileName.text = name
self.pictureFromFirebase(loginMethod: 0)
}
}
这是调试的正常输出,当我已经设置了图像,因此不需要从 Facebook 下载图像:
- 称为 - 从 facebook 下载图片 被称为 - 从 facebook 下载图片 - 无需从 facebook 下载图片 - 无需从 Facebook 下载图片
这是我删除整个第二个 if 语句时调试的输出(如果 profileImage.image == nil):
- 称为 被称为 - 无需从 facebook 下载图片 - 无需从 Facebook 下载图片
据我所见,除了函数被调用两次也是错误的之外,第二个语句在第一个语句执行之前被调用。由于第一个语句在设置 profileImage 之前需要一段时间,因此当第二个 if 语句检查此值时它为零。我如何确保不再发生这种情况?谢谢。
【问题讨论】:
-
拜托拜托。提问前先搜索。这已经被问过并回答过无数次了。
标签: swift function if-statement firebase firebase-realtime-database