2016-07-30 24 views
0

Für 12 Stunden habe ich 18 mal abgestürzte Berichte über eine HTTPRequest-Methode erhalten.iOS App stürzt manchmal ab, wenn HTTPRequest (JSON) verarbeitet wird

Diese Methode wird verwendet, um Songinformationen vom Server zu laden, z. B. Liedtitel, Interpret.

Die Absturzberichte von Fabric.io kommen, aber ich kann es nicht sehr gut untersteht, ist es eine Art von etwa NSOperation und Faden ....

Meine Frage ist, was zum Absturz bringen tat? und wie kann ich diese Funktion verbessern loadMetadata()?

Dies ist ein Screenshot von Crash-Bericht, warum ist bei Linie 0?

enter image description here

Dies sind der Code des Httprequest die bekommen JSON-Daten vom Server

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

Antwort

1

Nicht zu Ihrem Absturz verwendet, aber die Dokumentation lesen, dann herauszufinden, warum mit .AllowFragment absolutem Unsinn ist .

In Swift bedeutet ein Ausrufezeichen: "Ich bin 100 Prozent sicher, dass dieses Ding nicht Null sein kann, und wenn es nie Null ist, dann stürzen Sie bitte". Anscheinend folgte der Compiler pflichtbewusst Ihren Anweisungen und stürzt von Zeit zu Zeit ab.

Die erste Hürde, bei der Ihre App abstürzen kann, ist der Parameter "response", der optional ist. Wenn es null ist, wird Ihre App abstürzen, weil Sie das verlangten. Kein Wunder, dass es überall zusammenbricht. Erfahren Sie, wie Sie mit Optionen umgehen und Ihren Code entsprechend ändern.

+0

Vielen Dank! Ich habe wieder etwas über Optional gelernt und jetzt verstanden, wo das Problem liegt. – shilei365