如果没有连接,Internet或其他方式,XMLParser的子类与contentsOfURL初始化程序崩溃,以获取URL的内容

时间:2016-10-22 15:30:10

标签: ios swift swift3 nsxmlparser

我试图整理issue,如果没有连接来获取指定网址的内容(例如应用离线),则Feed解析框架(FeedKit)崩溃)。

因此,当应用程序在线并且仅在线时,它可以正常工作。

每当我尝试使用超类Parser

的便捷初始化程序实例化我的XMLParser类时
convenience init?(contentsOf url: URL)

框架崩溃了:

enter image description here

为了尝试隔离问题,并排除框架中引入的一些错误,我在一个干净的项目中重新创建了这个问题:

一个像魅力一样的解决方案,使用Foundation框架的普通的XMLParser:

let feedURL = URL(string: "http://images.apple.com/main/rss/hotnews/hotnews.rss")!

if let parser = XMLParser(contentsOf: feedURL) { // Works as expected
    print("Got instance \(parser)")
}

另一个没有:

class Parser: XMLParser { }

let feedURL = URL(string: "http://images.apple.com/main/rss/hotnews/hotnews.rss")!

if let parser = Parser(contentsOf: feedURL) { // Crash!
    print("Got instance \(parser)")
}

在第二个例子中,我所做的只是对XMLParser类进行子类化。没有覆盖或自定义代码。它仍然崩溃。

我错过了什么吗?

谢谢

编辑:

向Apple提交了错误报告,编号为28904764,并为此问题打开了Radar

我确信这是苹果公司最终的一个错误,但更愿意出错并做出修复。

2 个答案:

答案 0 :(得分:2)

这看起来像个错误。

但是,您可以覆盖XMLParserParser类的指定和便利初始值设定项并实现您自己的逻辑

class Parser: XMLParser {
    override init(data: Data)
    {
        super.init(data: data) 
    }

    convenience init?(contentsOf url: URL){
        //return data or null examining data from url
        do{
            let data = try Data(contentsOf: url)
            self.init(data: data)

        }catch{
            return nil
        }
    }
}

并致电

  let feedURL = URL(string: "http://images.apple.com/main/rss/hotnews/hotnews.rss")
  if let parser = Parser(contentsOf: feedURL!){
        print("Got instance \(parser)")
    }else{
        print("no data in url")
    }

答案 1 :(得分:-1)

我认为这是URL的问题。我试过你的代码我得到了错误。

Unable to read data

我尝试更换网址,

feedURL = NSURL(string:"http://images.apple.com/main/rss/hotnews/hotnews.rss#sthash.fuVEonEt.dpuf")!
parser = XMLParser(contentsOf:feedURL as URL)!
parser.delegate = self
parser.parse()

一切正常。 (我使用的是Swift 3)