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

时间:2018-03-01 21:38:25

标签: ios swift xml parsing

我正在尝试用线程解析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)
    }
}

1 个答案:

答案 0 :(得分:0)

c1: Radius: 2.67 Area: 22.396099868176275 c2: Radius: 3.0 Area: 28.274333882308138 是一个异步函数,而不是另一个线程。这意味着在parseFeed函数完成之前将调用fetchData()

为了避免这种情况,可能(我不知道HR115XMLParser肯定会这么说)可以使用闭包。

parseFeed