Swift - парсер XML очень медленный, несмотря на то, что он находится на самом высоком Qos? - PullRequest
0 голосов
/ 05 сентября 2018

Хорошо, я следовал руководству, чтобы добраться до этой точки, поэтому я не знаю, в чем проблема с этим - я просто анализирую / получаю данные из нескольких RSS-каналов, асинхронных в Swift. Я поставил все на самый высокий qos (userinteractive), но разбор по-прежнему медленный / ненадежный, с быстрым Wi-Fi.

Я храню свои каналы в var feeds = [RSS_FEED_URL_COT_multiple[0], RSS_FEED_URL_COT_multiple[1], RSS_FEED_URL, RSS_FEED_WAKEUP]

потом разбирай вот так:

/ PARSING --------------------------------------------- ----

// element start detected
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {


func start() {
        let q = DispatchQueue.global(qos: .userInteractive) //HERE PROBLEM
        q.async {
            for feed in self.feeds {
                if let u = URL(string: feed)
                {
                         self.parse(u)
                }
            }
        }
    }

    func parse(_ url: URL) {
        print("parsing of \(url)")
        let parser = XMLParser(contentsOf: url)!
        parser.delegate = self
        if parser.parse() {
            print("parse of \(url) complete")
        } else {
            print("parse of \(url.absoluteString) failed")

        }
    }

        if elementName == "item" {
            self.isTagFound["item"] = true
            self.rssRecord = RssRecord()

        }else if elementName == "title" {
            self.isTagFound["title"] = true

        }
        else if elementName == "content:encoded" {
            self.isTagFound["description"] = true
        }

        //Wakeup feed
        else if elementName == "description" {
            if(!self.isTagFound["description"]!)
            {
                 self.isTagFound["description"] = true
            }
        }
        else if elementName == "enclosure" {
            self.isTagFound["link"] = true
            self.isTagFound["epNum"] = true

            self.rssRecord?.link += attributeDict["url"]!
            self.rssRecord?.episodeNum += getNum(str: (self.rssRecord?.link)!)
        }
        else if elementName == "itunes:keywords" {
            self.isTagFound["keys"] = true
        }
        else if elementName == "itunes:duration" {
            self.isTagFound["duration"] = true
        }
        else if elementName == "pubDate" {
            self.isTagFound["pubDate"] = true
        }
        else if elementName == "itunes:title" {
            self.isTagFound["adLink"] = true
        }
        else if elementName == "itunes:image" {
            self.isTagFound["image"] = true

            if let str = attributeDict["href"]
            {
                //self.rssRecord?.img = setImg(urlStr: str)
                self.rssRecord?.imgStr = str
            }
        }
        else if elementName == "itunes:subtitle" {
            self.isTagFound["subtitle"] = true
        }

    }

Конечно, после каждого URL я делаю такую ​​сортировку, например:

func sortIntoFreeFeed()
    {
        for r in rssRecordList
        {
            if(!r.link.contains(find: wakeupSignifier))
            {
                if(r.link.contains(rssFreeSignifier) && rssFreeList.filter{$0.link == r.link}.count == 0)
                {
                    r.keys.removeAll()
                    rssFreeList.append(r)
                } else if (rssCOTList.filter{$0.link == r.link}.count == 0) {
                    rssCOTList.append(r)
                }
            }
        }

Но это не должно занять много времени, я думаю? В чем может быть проблема здесь?

...