如果没有连接、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)
我正在尝试解决 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)