swift 3 : Async queue is still blocking main thread/freezing app?

标签 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)
    }
}

这确实有效,意味着没有重入错误,但整个 UI 卡住了整整 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

最佳答案

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

希望它有用!

关于 swift 3 : Async queue is still blocking main thread/freezing app?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50282027/

相关文章:

swift - 本地视频文件循环tvOS

ios - Swift 代码正在向核心数据添加不需要的 nil 数据

java - CompletableFuture.allOf 已完成,即使其列表中的一个 CompletableFuture 尚未完成

javascript - 使用 $q 同步多个 Angular $http 调用/使用 $q.catch 进行错误处理

iOS:Swift:SDWebImage:cell.customImageView.sd_setImage(带有:imageURL)崩溃

swift - 如何将选取的图像添加到核心数据中

arrays - 数组或字典扩展中的 Swift 3.0 : compiler error when calling global func min<T>(T, T)

ios - 如何测试项目中的私有(private)或文件私有(private)函数

android - 在 listView 中加载异步图片

ios - touchesBegan方法中发生双击时如何防止调用单击