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

Ios 为什么在尝试使用线程时必须添加sleep()?,ios,swift,xml,parsing,Ios,Swift,Xml,Parsing,我试图用一个线程解析一个XML文件。但是,XML很大,我在数组中存储了20000多个项目。我考虑使用一个线程来帮助解析器在加载表数据时解析XML文件。然而,使用线程似乎不起作用。我仍然需要插入两个睡眠,以使其工作一点 如何解析XML文件并同时将数据加载到tableview中 let hr115XMLParser = HR115XMLParser() let billXMLParser = BillXMLParser() var viewBillItems: [BillModel] = []

我试图用一个线程解析一个XML文件。但是,XML很大,我在数组中存储了20000多个项目。我考虑使用一个线程来帮助解析器在加载表数据时解析XML文件。然而,使用线程似乎不起作用。我仍然需要插入两个睡眠,以使其工作一点

如何解析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是一个异步函数,而不是另一个线程。这意味着将在parseFeed函数完成之前调用fetchData

为了避免这种情况,也许我不知道HR115XMLParser是否可以肯定地说可以使用闭包

self.hr115XMLParser.parseFeed(url: "https://www.gpo.gov/smap/bulkdata/BILLSTATUS/115hr/sitemap.xml") {
    DispatchQueue.main.async {
        self.fetchData()
        self.tableView.reloadData()
    }
}

不,不要使用睡眠。这是非常非常错误的。当然,您的XML解析器有一些委托方法,您可以实现这些方法来告诉您何时完成解析。什么是HR115XMLParser?@MartinR HR115XMLParser是一种XML解析器,它解析指向其他XML文件的链接,允许我从国会法案加载信息。尤其是标签。在不知道其API委托方法的情况下,回调?我们只能猜测如何正确使用该解析器。它来自哪里?有关于它用法的文档吗?@rmaddy有。我应该在这里用吗?我应该在哪里使用它?