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.
我相信这是苹果公司最终的一个错误,但更愿意是错误的并且有一个修复.
这看起来像一个错误。
但是,您可以覆盖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)
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |