Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 赢得的字符串值';尽管有明确的声明,但Swift不会改变_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 赢得的字符串值';尽管有明确的声明,但Swift不会改变

Ios 赢得的字符串值';尽管有明确的声明,但Swift不会改变,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在制作一个应用程序,其中我必须返回一个字符串,表示存在对我的firebase实时数据库的某个引用(出于其他原因,我没有使用Bool)。尽管直接在上面和下面执行print命令,但当我打印函数时,字符串的值不会改变,并打印其默认值“Unchanged” 我的代码: func checkIfMovieHasAlreadyBeenShown(movieID: String) -> String { var hasItBeenSeen = "Unchanged" let uid

我正在制作一个应用程序,其中我必须返回一个字符串,表示存在对我的firebase实时数据库的某个引用(出于其他原因,我没有使用Bool)。尽管直接在上面和下面执行print命令,但当我打印函数时,字符串的值不会改变,并打印其默认值“Unchanged”

我的代码:

func checkIfMovieHasAlreadyBeenShown(movieID: String) -> String {

    var hasItBeenSeen = "Unchanged"
    let uid  = Auth.auth().currentUser?.uid
    let ref = Database.database().reference()
    ref.child("Seen Movies").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in

        if snapshot.hasChild(movieID){
            print("The Result:")
            self.changeStringHasItBeenSeen(YNString: "yes")
            print("YES")
        }

        else {
            print("The Result:")
            self.changeStringHasItBeenSeen(YNString: "no")
            print("NO")
        }
    })

    return hasItBeenSeen
}
印于此:

print(checkIfMovieHasAlreadyBeenShown(movieID: "39"))
print(checkIfMovieHasAlreadyBeenShown(movieID: "38"))

observeSingleEvent
在闭包中调用。
返回hasitbeensen
行将不受闭包中任何内容的影响,因为它将首先返回

想象一下:你告诉你的朋友去买些苹果。他还没走,你就向他要价。当然,他不会知道,因为他还没有去买苹果

在调用闭包之后(或者在购买苹果之后),您需要某种方式来执行某些操作。通常这可以通过一个完成处理程序来完成,在该处理程序中,您将闭包传递到您的
checkifmoviehasareadybeenshow
函数中,例如“在购买苹果后执行此操作”


然后您可以这样调用您的函数:
checkifmoviehasareadybeenshow(movieID:“39”,completion:{seen in print(seen)})

@schemetral的答案确实是问题:当运行
return hasItBeenSeen
时,值还没有加载。另见:,,喜欢苹果的比喻。