将FirebaseDataSnapshot作为字符串添加到数组(Swift 3)

时间:2017-03-07 13:27:23

标签: ios swift firebase firebase-realtime-database

所以我目前正在尝试获取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
    }

2 个答案:

答案 0 :(得分:1)

它实际上并没有重置自己。问题是你在Firebase有机会用1代替它之前调用postNumber.Firebase查询异步工作,基本上这意味着你的代码会在Firebase获取查询结果时继续运行。

显示这一点的简单方法是用此替换您的第一行。每次postNumber的值发生变化时,didSet都会运行。这将显示命令执行的确切顺序。

var postNumber = 0 {
  didSet {
    print(postNumber)
  }
}

如果你使用postCollection来填充你的collectionView,你可以使用

var postCollection = [String]() {
  didSet {
    collectionView?.reloadData()
  }
}

您可以保留其余代码,这可以让您基本了解异步是什么。通过一些谷歌搜索,您应该能够找到处理异步代码的优雅方法。

Async vs. synchronous

答案 1 :(得分:0)

为了详细说明上述答案,Firebase使用完成处理程序或回调,它允许您在完成异步调用后对从异步调用中检索的数据进行处理。在您的示例中,由于异步操作,在Firebase从异步调用返回之前,您的两个print命令都会执行。在Firebase完成处理程序之外执行的任何代码都有在检索数据之前执行的风险。

我会查看这个Firebase文档,该文档讨论了它们的异步操作和回调(完成处理程序)。

https://firebase.google.com/docs/database/ios/read-and-write