我试图用一个线程解析XML文件。但是,XML很大,我将超过20,000个项目存储到我的数组中。我想到使用一个线程来帮助解析器在表数据加载时解析XML文件。但是,似乎使用线程不起作用。我仍然需要插入两个sleep()以使其工作一点点。
如何解析我的XML文件并同时将数据加载到我的tableview中?
let hr115XMLParser = HR115XMLParser()
let billXMLParser = BillXMLParser()
var viewBillItems: [BillModel] = []
private var billItems: [BillModel]?
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.global(qos: .userInteractive).async {
self.hr115XMLParser.parseFeed(url: "https://www.gpo.gov/smap/bulkdata/BILLSTATUS/115hr/sitemap.xml")
DispatchQueue.main.async {
self.fetchData()
self.tableView.reloadData()
}
}
}
private func fetchData()
{
sleep(20)
for index in 0..<self.hr115XMLParser.billItems.count {
print()
print("NEW ITEM \(index)")
print()
self.billXMLParser.parseFeed(url: self.hr115XMLParser.billItems[index])
sleep(5)
print(self.billXMLParser.billItemsArray[index].billtitle)
print(self.billXMLParser.billItemsArray[index].billfullName)
print(self.self.billXMLParser.billItemsArray[index].billURL)
print()
print("END ITEM")
print()
var newViewBillItem = BillModel()
newViewBillItem.billtitle = self.billXMLParser.billItemsArray[index].billtitle
newViewBillItem.billfullName = self.billXMLParser.billItemsArray[index].billfullName
newViewBillItem.billURL = self.billXMLParser.billItemsArray[index].billURL
self.viewBillItems.append(newViewBillItem)
}
}
parseFeed
是一个异步函数,而不是另一个线程。这意味着在fetchData()
函数完成之前将调用parseFeed
。
为了避免这种情况,也许(我不知道HR115XMLParser肯定地说它)可以使用闭包。
self.hr115XMLParser.parseFeed(url: "https://www.gpo.gov/smap/bulkdata/BILLSTATUS/115hr/sitemap.xml") {
DispatchQueue.main.async {
self.fetchData()
self.tableView.reloadData()
}
}