Хорошо, я следовал руководству, чтобы добраться до этой точки, поэтому я не знаю, в чем проблема с этим - я просто анализирую / получаю данные из нескольких 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)
}
}
}
Но это не должно занять много времени, я думаю? В чем может быть проблема здесь?