处理HTTPRequest(JSON)时,iOS应用程序有时会崩溃

时间:2016-07-30 12:13:13

标签: ios json swift httprequest

在12个小时内,我收到了18次关于一个HTTPRequest方法的崩溃报告。

此方法用于从服务器加载歌曲信息,例如歌曲标题,解释。

崩溃报告来自Fabric.io,但我不能很好地解决它,它是关于NSOperation和线程....

我的问题是,是什么造成了崩溃?以及如何改进此功能loadMetadata()

这是崩溃报告的截图,为什么在第0行 ??

enter image description here

这是从服务器

获取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()
    } 
}

1 个答案:

答案 0 :(得分:1)

与您的崩溃无关,但请阅读文档,然后找出使用.AllowFragment绝对无意义的原因。

在Swift中,感叹号表示:&#34;我百分百肯定这个东西不能为零,如果它永远是零,那么请崩溃&#34;。显然,编译器尽职地遵循您的指示并且不时崩溃。

你的应用程序崩溃的第一个障碍是&#34;响应&#34;参数,可选。如果它是零,你的应用程序将崩溃,因为这是你要求的。毫不奇怪它在整个地方崩溃了。了解如何处理选项并相应地更改代码。