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

nmd*_*ias 6 nsxmlparser ios swift swift3

我正在尝试解决一个问题,如果没有连接来获取指定URL的内容(例如,应用程序处于脱机状态),则Feed解析框架(FeedKit)会崩溃.

因此,它适用于应用程序在线和仅在线时.

每当我尝试Parser使用超类的便利初始化器来实例化我的类时XMLParser

convenience init?(contentsOf url: URL)
Run Code Online (Sandbox Code Playgroud)

框架崩溃:

在此输入图像描述

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

一个像魅力一样的解决方案,使用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)")
}
Run Code Online (Sandbox Code Playgroud)

而另一个没有:

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)")
}
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么吗?

谢谢

编辑:

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

我相信这是苹果公司最终的一个错误,但更愿意是错误的并且有一个修复.

LC *_*C 웃 2

这看起来像一个错误。

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

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并调用为

  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")
    }
Run Code Online (Sandbox Code Playgroud)