尽管明确声明,String的值在Swift中不会改变

时间:2018-08-06 01:25:28

标签: ios swift firebase firebase-realtime-database

我正在制作一个应用程序,其中我必须返回一个表示对Firebase实时数据库的特定引用的存在的String(出于其他原因,我没有使用Bool)。尽管直接在上方和下方执行打印命令,但是当我打印函数时,String的值不会改变,并打印其默认值“ 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"))

1 个答案:

答案 0 :(得分:3)

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

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

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

然后您将以这种方式调用函数:checkIfMovieHasAlreadyBeenShown(movieID: "39", completion: { seen in print(seen) })