在12个小时内,我收到了18次关于一个HTTPRequest方法的崩溃报告。
此方法用于从服务器加载歌曲信息,例如歌曲标题,解释。
崩溃报告来自Fabric.io,但我不能很好地解决它,它是关于NSOperation和线程....
我的问题是,是什么造成了崩溃?以及如何改进此功能loadMetadata()
?
这是崩溃报告的截图,为什么在第0行 ??
这是从服务器
获取JSON数据的HTTPRequest代码func loadMetadata() {
if self.hasConnectivity() {
let url = NSURL(string: "http://sites.exampleserver.de/files/playlist/streamdaten_json.txt")
let request = NSMutableURLRequest(URL:url!)
let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
sessionConfiguration.requestCachePolicy = .ReloadIgnoringLocalCacheData
let session = NSURLSession(configuration: sessionConfiguration, delegate: nil, delegateQueue: nil)
session.dataTaskWithRequest(request) { (data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) as? NSDictionary
print(json)
var title : String
var interpret : String
switch (self.channels.channel) {
case 0:
title = json?.objectForKey("Titel_Live") as! String
interpret = json?.objectForKey("Interpret_Live") as! String
case 1:
title = json?.objectForKey("Titel_InTheMix") as! String
interpret = json?.objectForKey("Interpret_InTheMix") as! String
default:
title = ""
interpret = ""
}
if self.lastTitle != title || self.lastInterpret != interpret || self.lastChannel != self.channels.channel {
if title.lengthWithoutWhitespace() < 1 && interpret.lengthWithoutWhitespace() < 1 {
self.songTitle = self.channels.currentDefaultArtist
self.albumTitle = self.channels.currentDefaultTitle
} else {
if self.lastTitle != title { // title has changed
self.albumTitle = title.lengthWithoutWhitespace() > 1 ? title : self.channels.currentDefaultArtist
}
if self.lastInterpret != interpret || self.lastChannel != self.channels.channel { // interpret has changed
self.songTitle = interpret.lengthWithoutWhitespace() > 1 ? interpret : self.channels.currentDefaultArtist
}
}
}
self.lastTitle = title
self.lastInterpret = interpret
self.lastChannel = self.channels.channel
// Test currentInfo
self.metaDataHandler.setInfo(artist: self.songTitle, title: self.albumTitle)
}catch {
print("Error with Json: \(error)")
}
}
}.resume()
}
}
答案 0 :(得分:1)
与您的崩溃无关,但请阅读文档,然后找出使用.AllowFragment绝对无意义的原因。
在Swift中,感叹号表示:&#34;我百分百肯定这个东西不能为零,如果它永远是零,那么请崩溃&#34;。显然,编译器尽职地遵循您的指示并且不时崩溃。
你的应用程序崩溃的第一个障碍是&#34;响应&#34;参数,可选。如果它是零,你的应用程序将崩溃,因为这是你要求的。毫不奇怪它在整个地方崩溃了。了解如何处理选项并相应地更改代码。