作者:手机用户2602891283 | 来源:互联网 | 2023-05-19 17:16
从documentation中我可以得到一些用户数据(我已经正确地获得了),但是,按照其结构方式,它不允许我访问其外部的数组,这就是我的意思,我有一个功能:
func observe() {
let postsref = Database.database().reference(withPath: "post")
struct test {
static var tempPosts = [Post]()
}
postsref.observe(.value,with: { snapshot in
for child in snapshot.children {
if let childsnapshot = child as? Datasnapshot,let data = childsnapshot.value as? [String:Any],// let timestamp = data["timestamp"] as? Double,let first_name = data["Author"] as? String,let postTitle = data["title"] as? String,let postDescription = data["description"] as? String,let postUrl = data["postUrl"] as? String,let postAddress = data["Address"] as? String,let url = URL(string:postUrl)
{
// Convert timestamp to date
// let newDate = self.getDateFromTimeStamp(timestamp:timestamp)
// Store variables from DB into post
let post = Post(author: first_name,postTitle: postTitle,postDescription: postDescription,postUrl: url,postAddress: postAddress)
test.tempPosts.append(post)
}
}
self.posts = test.tempPosts
// HERE IT WORKS
print(test.tempPosts[0].postTitle," 0")
self.tableView.reloadData()
})
// HERE IT DOEsn'T WORK
print(test.tempPosts[0].postTitle," 0")
}
并且我正在尝试访问数据// HERE IT DOEsn'T WORK
,该如何访问其外部的数组?我以后再打吧
observe()方法是异步的,因此在调用postsRef.observe之后,仅在应用程序收到Firebase的响应之后才运行在该闭包中执行的代码,因此会有延迟。但是,此调用之后未存储在闭包中的所有代码将立即执行。
因此,将执行.observe异步功能调用,然后紧接着执行//这里的下一行//。这就是为什么它不起作用的原因,因为在收到服务器响应之后,test.tempPosts不会包含任何值,并且到那时,闭包外的打印语句已经运行。
查看此StackOverflow答案,以获取有关异步与同步的更多信息。
Asynchronous vs synchronous execution,what does it really mean?
您也可能希望研究Swift here上的闭包。
如果要访问闭包之外的值,则需要使用completion handler或class property。
编辑:
这是一个例子
func observe (finished: @escaping ([Post]) -> Void) {
// ALL YOUR CODE...
finished(test.tempPosts)
}
func getTempPosts () {
observe( (tempPosts) in
print(tempPosts)
}
}