不知道这里发生了什么,因为我已经遵循了其他使用这个的答案,包括Swift: synchronously perform code in background; queue.sync does not work as I would expect
我有一个XMLParser,需要加载2个RSS提要。为了防止可重入解析,我需要一个接一个地加载这些url。问题是我需要在后台/async中这样做,这样它就不会冻结UI。
我有这个:

var myParser: XMLParser = XMLParser()
let parseQueue = DispatchQueue(label: "xmlQueue", attributes: [], target: nil)
var feeds = [RSS_FEED_URL_COT, RSS_FEED_URL] //this order
self.parseQueue.async {
    for f in feeds
    {
        self.loadRSSData(rssFeed: f)
    }
}

这确实有效,意味着没有可重入错误,但整整30秒,整个UI都被冻结了。我在这里做错什么了?
编辑:
func loadRSSData(rssFeed: String){

        if let rssURL = URL(string: rssFeed) {

            print("LOADING THE URL: ", rssURL)

            // fetch rss content from url
            if let contents = XMLParser(contentsOf: rssURL)
            {
               self.myParser = contents
            }

            // set parser delegate
            self.myParser.delegate = self
            self.myParser.shouldResolveExternalEntities = false

            // start parsing
            self.myParser.parse()
        }

    }

swift - Swift 3:异步队列仍在阻止主线程/卡住应用程序?-LMLPHP
swift - Swift 3:异步队列仍在阻止主线程/卡住应用程序?-LMLPHP

最佳答案

@谢古伊,
请使用下面的装载机数据。
函数加载rssdata(rssFeed:String){

    if let rssURL = URL(string: rssFeed) {

        print("LOADING THE URL: ", rssURL)

        // fetch rss content from url
        if let contents = XMLParser(contentsOf: rssURL)
        {
           self.myParser = contents
        }

        // set parser delegate
        self.myParser.delegate = self
        self.myParser.shouldResolveExternalEntities = false

        **DispatchQueue.main.async{
           // start parsing
              self.myParser.parse()
        }**
    }
}

希望成功!

关于swift - Swift 3:异步队列仍在阻止主线程/卡住应用程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50282027/

10-12 14:42
查看更多