热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从一个闭包swift/firebase中修改一个变量-modifyingavariablefrominsideaclosureswift/firebase

Inthefunctionbelow,everythingworksexceptwhenItrytogetthevariablepartnerNamefrompoint

In the function below, everything works except when I try to get the variable partnerName from point A to point B, i.e. moving the variable in an out of a closure. I am a novice coder so I am hoping that someone can help me discover how to solve this particular issue and point me to a place where I might be able to learn the basics of how to share variables between different parts of a function.

在下面的函数中,一切都有效,除非我尝试从A点到B点获取变量partnerName,即将变量移出闭包。我是一名新手编码器,所以我希望有人可以帮我发现如何解决这个特定问题并指出我可以学习如何在函数的不同部分之间共享变量的基础知识。

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)
        }
    }

}

1 个解决方案

#1


0  

I recommend you read the documentation on closures:

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

Closures

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Closures: Capturing Values

闭包:捕获价值观

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID103


推荐阅读
author-avatar
jin冫g_-_-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有