首页 > 解决方案 > 如何将解析后的数据存储在数组中?

问题描述

我在 Firebase 上有一个数据库。我解析了一些我想存储在结构数组中的数据:
postData.swift

struct postData {
  let Title: String
  let Subtitle: String
  let imgURL: String
  let Date: String

  init(Title: String, Subtitle: String, imgURL: String, Date: String) {
    self.Title = Title
    self.Subtitle = Subtitle
    self.imgURL = imgURL
    self.Date = Date
  }
}

该数组将用于在tableViewCells中创建collectionViewCells。在我的 ViewController 中,我创建了一个全局数组 ,我将在其中存储解析的数据。这是我制作的一个功能:var dataPosts:[postData] = []

var dataPosts:[postData] = []
...
override func viewDidLoad() {
       super.viewDidLoad()
       tableView = UITableView(frame: self.view.bounds, style: .grouped)
       tableView.delegate = self
       tableView.dataSource = self
       ...
       tableView.register(PostCell.self, forCellReuseIdentifier: PostTableID)
       parsePosts()
       print(dataPosts.count) // prints 0
   }
   
   func parsePosts() {
       let databaseRef = Database.database().reference(withPath: "Посты")
       var data:[postData]
       databaseRef.observeSingleEvent(of: .value) { (snapshot) in
           for child in snapshot.children {
               let snap = child as! DataSnapshot
               let res = snap.value as! [String: Any]
               
               let title = res["Заголовок"] as! String
               let subtitle = res["Подзаголовок"] as! String
               let img = res["URL"] as! String
               let date = res["Дата"] as! String
               
               self.dataPosts.append(postData(Title: title, Subtitle: subtitle, imgURL: img, Date: date))
               print(self.dataPosts.count, " - inside cycle") // prints 1
           }
       }
       data = dataPosts
       print(data.count, " - inside function") // prints 0
   }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataPosts.count
   }

有没有办法将它存储在数组中?或者我应该使用 OOP 中的东西(我是初学者)?谢谢

标签: iosswiftfirebasestruct

解决方案


首先,请以大写字母开头的结构和以小写字母开头的变量命名。该init方法不需要

struct PostData {
    let title: String
    let subtitle: String
    let imgURL: String
    let date: String
}

var dataPosts : [PostData] = []

实际上,您只需在异步接收数据的闭包内循环之后重新加载表视图。data不需要临时数组。

func parsePosts() {
   let databaseRef = Database.database().reference(withPath: "Посты")
   
   databaseRef.observeSingleEvent(of: .value) { (snapshot) in
       for child in snapshot.children {
           let snap = child as! DataSnapshot
           let res = snap.value as! [String: Any]
           
           let title = res["Заголовок"] as! String
           let subtitle = res["Подзаголовок"] as! String
           let img = res["URL"] as! String
           let date = res["Дата"] as! String
           
           self.dataPosts.append(PostData(title: title, subtitle: subtitle, imgURL: img, date: date))
           print(self.dataPosts.count, " - inside cycle") // prints 1
       }
       
       self.tableView.reloadData()
   }
}

并删除

print(dataPosts.count) // prints 0   

viewDidLoad,没用。


推荐阅读