【发布时间】:2017-08-11 04:57:08
【问题描述】:
我整天都在为此苦苦挣扎,这似乎没有任何意义,因为我有非常相似的代码可以正常工作。我已经尝试了所有方法,我尝试过创建一个单独的方法来返回一个字符串数组,但都没有奏效。每次在括号外访问时,postIDs 数组都设置为 null,后跟括号(在读取“print(self.postIDs)”的行之后)。感谢您能给我的任何帮助。
var postIDs = [String]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
let ref = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
ref.child("users").child(uid).child("saved").observeSingleEvent(of: .value, with: { snapshot in
var ids = [String]()
let saved = snapshot.value as! [String:AnyObject]
for (elem, _) in saved {
ids.append(elem)
}
self.postIDs = ids
print(self.postIDs) // returns the values I would expect
})
ref.removeAllObservers()
guard self.postIDs.count >= 1 else {return} // postIDs count is equal to 0 here, and when I print postIDs the result is []
【问题讨论】:
-
原因是
observeSingleEvent中的代码块与函数的其余部分不在同一个线程中。其余的在主线程中,而observeSingleEvent在后台运行。它们是异步的。数据加载完成后需要获取postIDs。 -
获得预期值的语句位于闭包内。这会导致关闭块的延迟执行。您可以尝试检查是否可以实现完成处理程序,或者您应该在闭包内部使用数组来执行所需的操作。
-
在
observeSingleEvent块的内部和外部放置断点,你会看到不同。