Swift 3: асинхронная очередь все еще блокирует основной поток / замораживание приложения? - PullRequest
0 голосов
/ 11 мая 2018

Понятия не имею, что здесь происходит, так как я следовал за другими ответами, которые используют это, включая Swift: синхронно выполнять код в фоновом режиме;queue.sync не работает, как я ожидал

У меня есть XMLParser, который мне нужен для загрузки 2 RSS-каналов.Чтобы предотвратить повторный вход, мне нужно загружать эти URL-адреса один за другим.Проблема в том, что мне нужно сделать это в фоновом / асинхронном режиме, чтобы он не зависал в пользовательском интерфейсе.

У меня есть следующее:

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 голосов
/ 13 мая 2018

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

Надеюсь, это сработало!

...