如果没有连接、Internet 或其他方式获取 URL 的内容,XMLParser 的子类会因 contentsOfURL 初始值设定项而崩溃

Subclass of XMLParser crashes with the contentsOfURL initializer if there isn't connectivity, Internet or otherwise, to get the contents of the URL

我正在尝试解决 issue where a feed parsing framework (FeedKit) 在没有连接以获取指定 URL 的内容时崩溃的问题(例如,应用程序处于离线状态)。

因此,它在应用程序在线时有效,并且仅在线。

每当我尝试使用 superclass XMLParser

的便利初始化程序实例化我的 Parser class
convenience init?(contentsOf url: URL)

框架崩溃:

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

一个非常有效的解决方案,使用 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)")
}

在第二个示例中,我所做的只是 class 子 XMLParser class。没有任何覆盖或自定义代码。它仍然崩溃。

我是不是漏掉了什么?

谢谢

编辑:

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

我确信这是 Apple 端的错误,但我宁愿错了也希望有修复。

这看起来像是一个错误。

但是,您可以在 Parser 中覆盖 XMLParser class 的指定和便利初始化程序并实现您自己的逻辑

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")
    }

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

Unable to read data

我尝试替换 URL,

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)