所以我目前正在尝试获取Firebase数据库中的“帖子”数量,但出于某种原因,它表示数量等于1(这是真的)但在调用“postNumber”时会自行重置。我还想将数据保存在数组中供以后使用,所以我将它全部保存在一个数组中,而不是直接从数据库中读取而根本不存储任何数据。
viewDidLoad()函数
// Downloading & Deserializing the Json file
var jsonMain = wc.DownloadString("http://api.flexianalysis.com/services/FlexiAnalysisService.svc/FlexiAnalysisNews?key=___&catagory=Forex");
JObject token2 = JObject.Parse(jsonMain);
List<News> listNews = new List<News>();
foreach (var result in token2["d"])
{
news = new News();
news.id = (string)result["ID"];
news.Title = (string)result["Title"];
news.Date = (string)result["PublishingDate"];
news.Content = (string)result["News"];
listNews.Add(news);
}
return View(listNews);
updateFeed函数
var postNumber = 0
override func viewDidLoad() {
super.viewDidLoad()
updateFeed()
print("PostNumber in ViewDidLoad: \(self.postNumber)") //equals 0
collectionView?.backgroundColor = .white
}
答案 0 :(得分:1)
它实际上并没有重置自己。问题是你在Firebase有机会用1代替它之前调用postNumber.Firebase查询异步工作,基本上这意味着你的代码会在Firebase获取查询结果时继续运行。
显示这一点的简单方法是用此替换您的第一行。每次postNumber的值发生变化时,didSet都会运行。这将显示命令执行的确切顺序。
var postNumber = 0 {
didSet {
print(postNumber)
}
}
如果你使用postCollection来填充你的collectionView,你可以使用
var postCollection = [String]() {
didSet {
collectionView?.reloadData()
}
}
您可以保留其余代码,这可以让您基本了解异步是什么。通过一些谷歌搜索,您应该能够找到处理异步代码的优雅方法。
答案 1 :(得分:0)
为了详细说明上述答案,Firebase使用完成处理程序或回调,它允许您在完成异步调用后对从异步调用中检索的数据进行处理。在您的示例中,由于异步操作,在Firebase从异步调用返回之前,您的两个print
命令都会执行。在Firebase完成处理程序之外执行的任何代码都有在检索数据之前执行的风险。
我会查看这个Firebase文档,该文档讨论了它们的异步操作和回调(完成处理程序)。
https://firebase.google.com/docs/database/ios/read-and-write