ios - 如何将解析后的数据存储在数组中?
问题描述
我在 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 中的东西(我是初学者)?谢谢
解决方案
首先,请以大写字母开头的结构和以小写字母开头的变量命名。该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
,没用。
推荐阅读
- spring-boot - 如何启用 spring-actuator 从多个应用程序收集指标
- html - 实现 h2 时如何修复内容
- java - 我应该使用哪个 API 从图像中提取信息?
- kernel - 如何重新编译 glibc 以支持较旧的内核版本?
- scala - 制定正确的情景短语
- node.js - 如何从节点中的MongoDB中的数组中获取具有给定ID和给定用户名的项目
- python - tflight 图创建错误
- azure - 如何在 Azure 存储帐户上找到我的热 LRS 写入操作的来源?
- python - python 3解释器可能不稳定
- node.js - 我在这段代码中没有看到任何问题,但邮递员给了我一个错误?