当我尝试使用线程时,为什么必须添加sleep()?

问题描述 投票:-2回答:1

我试图用一个线程解析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)
    }
}
ios swift xml parsing
1个回答
0
投票

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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.