-2

我正在尝试将完成块的值存储到字典中。但我不知道如何访问它并将其存储在本地字典变量中。

var id = String()
var answeredDict = [String:[String]]()
var answeredDictUsers = [String:String]()

override func viewDidLoad() {
    super.viewDidLoad()
    for user in answeredDict.keys{
        let ref = Database.database().reference(fromURL: "URL").child("users/\(user)")
        ref.child("name").observeSingleEvent(of: .value) { (snap) in
            guard let name = snap.value as? String else { return }
            self.answeredDictUsers.updateValue(name, forKey: user)
        }
    }
    print(answeredDictUsers)
}

print(answeredDictUsers) 给出 [:] (空字典)

4

1 回答 1

2

数据从 Firebase 异步加载。到您print(answeredDictUsers)运行时,回调中的代码尚未运行。由于self.answeredDictUsers.updateValue(name, forKey: user)还没有运行,打印会看到一个空数组。您可以通过在这两行上放置断点并在调试器中运行代码来轻松地自行测试。

这意味着任何需要来自数据库的数据的代码,都必须在从数据库中获取该数据的回调/完成处理程序中(从中调用)。

一个非常简单的例子:

for user in answeredDict.keys{
    let ref = Database.database().reference(fromURL: "URL").child("users/\(user)")
    ref.child("name").observeSingleEvent(of: .value) { (snap) in
        guard let name = snap.value as? String else { return }
        self.answeredDictUsers.updateValue(name, forKey: user)
        print(answeredDictUsers)
    }
}

每次加载您的用户数据之一时,上述内容都会打印字典。

如果您只想在加载所有用户的数据后打印字典,例如,您可以保留一个计数器:

let count = 0
for user in answeredDict.keys{
    let ref = Database.database().reference(fromURL: "URL").child("users/\(user)")
    ref.child("name").observeSingleEvent(of: .value) { (snap) in
        guard let name = snap.value as? String else { return }
        self.answeredDictUsers.updateValue(name, forKey: user)
        count = count + 1
        if count == dict.count {
            print(answeredDictUsers)
        }
    }
}
于 2019-08-22T13:45:27.517 回答