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

标签 ios swift swift3 nsxmlparser

我正在尝试整理一个 issue如果没有连接以获取指定 URL 的内容(例如,应用程序处于离线状态),提要解析框架 ( FeedKit ) 会崩溃。

因此,它在 App 在线时有效,并且仅在线。

每当我尝试使用父类(super class) XMLParser 的便利初始化程序实例化我的 Parser 类时

convenience init?(contentsOf url: URL)

框架崩溃:

enter image description here

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

一个像魅力一样工作的解决方案,使用 Foundation 框架的普通 vanilla 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对这个问题。

我相信这是 Apple 端的错误,但我宁愿犯错并进行修复。

最佳答案

这看起来像一个错误。

但是,您可以在Parser 中重写XMLParser 类的指定初始化器和便利初始化器,并实现您自己的逻辑

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

关于ios - 如果没有连接、Internet 或其他方式获取 URL 的内容,则 XMLParser 的子类会因 contentsOfURL 初始值设定项而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40193859/

相关文章:

iOS 12 音乐应用的锁屏控制

iphone - 如何访问 UIImagePickerController 上的相机闪光灯?

ios - UINavigationController 最多只能处理 4 个 Viewcontroller 吗?

ios - 有没有办法实时控制iPhone振动的强度

ios - 如何在 Swift 3.0 中调用 REST 服务

ios - 覆盖 UILabel 字体会导致标签被截断

ios - 在 Swift 中,我可以检测 CLLocation 是否有效吗?

ios - Nuance SpeechKit 停止工作

swift3 - 在 Swift 3 中将类型为 'UnsafeMutableRawPointer' 的变量转换为 UnsafeMutablePointer<>

ios - 在 swift 3 playground 中阅读 plist