从闭包swift/firebase内部修改变量

从闭包swift/firebase内部修改变量,swift,firebase,Swift,Firebase,在下面的函数中,除了我尝试将变量partnerName从点A移到点B(即将变量从闭包中移出)时,所有操作都有效。我是一个新手,所以我希望有人能帮助我发现如何解决这个问题,并把我带到一个地方,在那里我可以学习如何在函数的不同部分之间共享变量的基础知识 func getAllConversations(handler: @escaping (_ conversationsArray: [Conversation]) -> ()) { var partner = [""]

在下面的函数中,除了我尝试将变量partnerName从点A移到点B(即将变量从闭包中移出)时,所有操作都有效。我是一个新手,所以我希望有人能帮助我发现如何解决这个问题,并把我带到一个地方,在那里我可以学习如何在函数的不同部分之间共享变量的基础知识

func getAllConversations(handler: @escaping (_ conversationsArray: [Conversation]) -> ()) {
        var partner = [""]
        var title: String = ""
        var partnerName = ""

        var conversationsArray = [Conversation]()
        REF_CONVERSATION.observeSingleEvent(of: .value) { (conversationSnapshot) in
            guard let conversationSnapshot = conversationSnapshot.children.allObjects as? [DataSnapshot] else { return}
            for conversation in conversationSnapshot {
                let memberArray = conversation.childSnapshot(forPath: "members").value as! [String]
                partner = memberArray.filter {$0 != (Auth.auth().currentUser?.uid)!}
                if memberArray.contains((Auth.auth().currentUser?.uid)!) {

                    let newPartner = (String(describing: partner))
                    title = newPartner.replacingOccurrences(of: "[\\[\\]\\^+<>\"]", with: "", options: .regularExpression, range: nil)

                        databaseRef.child("bodhi").child(title).observeSingleEvent(of: .value, with: { (snapshot) in

                            if let bodhiDict = snapshot.value as? [String: AnyObject]
                            {
                                //I realize that the variable is being wrongly redeclared here to make this run.
                                let partnerName = (bodhiDict["Name"] as! String)
                                    print ("partnerName returned from firebase: \(partnerName)")
                                // Point A: This prints "Sandy"
                            }
                        })

                    print ("partnerName: \(partnerName)")
                    // Point B: This prints nothing but if I add partnerName = "Sandy", then the function complete
                    title = partnerName
                    print ("new title: \(title)")
                    let conversation = Conversation(conversationTitle: title, key: conversation.key, conversationMembers: memberArray, conversationMemberCount: memberArray.count)
                    conversationsArray.append(conversation)
                }
            }
            handler(conversationsArray)
        }
    }

    func createGroup(withTitle title: String, andDescription description: String, forUserIds ids: [String], handler: @escaping (_ groupCreated: Bool) -> ()) {
        REF_GROUPS.childByAutoId().updateChildValues(["title": title, "description": description, "members": ids])
        //    need to add code here for slow internet: if successful connection true else error
        handler(true)
    }

    func getAllGroups(handler: @escaping (_ groupsArray: [Group]) -> ()) {
        var groupsArray = [Group]()
        REF_GROUPS.observeSingleEvent(of: .value) { (groupSnapshot) in
            guard let groupSnapshot = groupSnapshot.children.allObjects as? [DataSnapshot] else { return}
            for group in groupSnapshot {
                let memberArray = group.childSnapshot(forPath: "members").value as! [String]
                if memberArray.contains((Auth.auth().currentUser?.uid)!) {
                    let title = group.childSnapshot(forPath: "title").value as! String
                    let description = group.childSnapshot(forPath: "description").value as! String
                    let group = Group(title: title, description: description, key: group.key, members: memberArray, memberCount: memberArray.count)
                    groupsArray.append(group)
                }
            }
            handler(groupsArray)
        }
    }

}
func getAllConversations(处理程序:@escaping(uConversationsArray:[Conversation])->()){
var partner=[“”]
变量标题:String=“”
var partnerName=“”
var conversationsArray=[Conversation]()
中的REF_CONVERSATION.observeSingleEvent(of:.值){(conversationSnapshot)
guard let conversationSnapshot=conversationSnapshot.children.AllObject作为?[DataSnapshot]else{return}
用于会话快照中的会话{
让memberArray=conversation.childSnapshot(forPath:“members”)。值为![String]
partner=memberArray.filter{$0!=(Auth.Auth().currentUser?.uid)!}
如果memberArray.contains((Auth.Auth().currentUser?.uid)!){
让newPartner=(字符串(描述:partner))
title=newPartner.replacingOccurrences(of:“[\\[\\]\\\^+\”],with:”,选项:。正则表达式,范围:nil)
databaseRef.child(“bodhi”).child(title).observeSingleEvent(的值为:),其中:{(快照)位于
如果让bodidict=snapshot.value为?[字符串:AnyObject]
{
//我意识到变量在这里被错误地重新声明以使其运行。
让partnerName=(bodidict[“Name”]作为!字符串)
打印(“从firebase返回的partnerName:\(partnerName)”)
//A点:这印的是“桑迪”
}
})
打印(“partnerName:\(partnerName)”)
//点B:这不会打印任何内容,但是如果我添加partnerName=“Sandy”,那么函数就完成了
title=合作伙伴名称
打印(“新标题:\(标题)”)
let conversation=conversation(conversationTitle:title,key:conversation.key,conversationMembers:memberArray,conversationMemberCount:memberArray.count)
conversationsArray.append(会话)
}
}
处理程序(会话Sarray)
}
}
func createGroup(标题:String,描述:String,foruserid:[String],处理程序:@escaping(groupCreated:Bool)->()){
REF_GROUPS.childByAutoId().updateChildValue([“title”:title,“description”:description,“members”:ids])
//需要在此处添加代码以降低internet速度:如果连接成功,则为true,否则为错误
处理程序(true)
}
func getAllGroups(处理程序:@escaping(u-groupsArray:[Group])->()){
var groupsArray=[Group]()
中的REF_GROUPS.observeSingleEvent(of:.值){(groupSnapshot)
guard let groupSnapshot=groupSnapshot.children.allObjects作为?[DataSnapshot]else{return}
对于groupSnapshot中的组{
让memberArray=group.childSnapshot(forPath:“members”)。值为![String]
如果memberArray.contains((Auth.Auth().currentUser?.uid)!){
让title=group.childSnapshot(forPath:“title”)。值为!字符串
let description=group.childSnapshot(forPath:“description”)。值为!字符串
let group=group(标题:title,描述:description,key:group.key,成员:memberArray,memberCount:memberArray.count)
groupsArray.append(组)
}
}
处理程序(groupsArray)
}
}
}

我建议您阅读有关闭包的文档:

闭包

闭包:捕获值


对您有帮助吗?阅读本文后,似乎因为我从服务器上的一个节点获取一个值,并使用该值定义对第二个节点的请求,所以我需要在现有处理程序中创建第二个完成处理程序,以将partner name变量返回到外部完成处理程序。请告知我是否在写入路径上使用,对我来说,还有几个小时的工作要做。:)阅读本文后,似乎因为我从服务器上的一个节点获取一个值,并使用该值定义对第二个节点的请求,我需要在现有处理程序中创建第二个完成处理程序,以将partner name变量返回到外部完成处理程序。如果我我在写的轨道上,因为,对我来说,还有几个小时的工作要做。:)我至少把变量放入了完成处理程序中: