Swift 3:异步队列仍然阻塞主线程/冻结应用程序?

时间:2018-05-10 21:51:48

标签: swift asynchronous swift3 xml-parsing grand-central-dispatch

不知道这里发生了什么,因为我已经按照其他使用此问题的答案进行了操作,包括Swift: synchronously perform code in background; queue.sync does not work as I would expect

我有一个XMLParser,我需要加载2个RSS源。为了防止重入解析,我需要一个接一个地加载这些URL。问题是我需要在后台/异步中执行此操作,因此它不会冻结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秒内整个用户界面被冻结了。我在这做错了什么?

编辑:

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()
        }

    }

enter image description here enter image description here

1 个答案:

答案 0 :(得分:-1)

@Sjyguy,

请使用如下所示的loadRSSData。

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

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

希望它有效!