2016-07-29 14 views
1

Ich arbeite an einer App, in der die API über NSURLSession aufgerufen wird. Wenn die Api richtig es funktioniert, ist kein Problem, aber wenn keine Daten aufgrund irgendeinen Fehler empfangen wird dann nach Serialisierung wirft es Fehler, aber der sonst Block für sie nieTry Block funktioniert nicht richtig

let task = session.dataTaskWithRequest(request) { (let data, let response, let error) in 


     do { 
      guard let data:NSData = data , let response: NSURLResponse = response where error == nil else { 
       throw error! 
      } 

      guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else{ 
       print("Serialization failed") //This block never executes even if the Serialization Fails 
       throw JSONError.ConversionFailed 

      } 

      guard json.valueForKey("success") != nil else { 
       return 
      } 


      self.apidata = json 
      dispatch_async(dispatch_get_main_queue()){ 
       self.tableView.reloadData() 
      } 
      print(json.valueForKey("success")!) 

     } 
     catch let error as JSONError{ 
      self.showalertview(error.rawValue) 
      print(error.rawValue) 
     } catch let error as NSError{ 


      print(error.debugDescription) 
     } 
    } 

    task.resume() 

genannt Was ist hier falsch mache mir ?? ?

+0

Welchen 'else' Block erwarten Sie zu laufen? – dasblinkenlight

+0

@dasblinkenlight i dies erwarten zu laufen, wenn Serialisierung sonst ausfällt { print („Serialisierung fehlgeschlagen“) // Dieser Block führt nie, selbst wenn die Serialisierung throw schlägt JSONError.ConversionFailed } –

+0

ich die dritte Schutzblock vermuten genannt wird wenn es keine Daten gibt –

Antwort

1

Bedenken Sie:

do { 
    guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else { 
     // A 
    } 
} catch { 
    // B 
} 

Wenn NSJSONSerialization einen Fehler wirft (dh, wenn es nicht wirklich eine JSON-Antwort war oder wenn die Antwort fehlerhaft war), wird sie gehen direkt an B und die guard Eure nicht komm in das Spiel. Die guard-Anweisung führt nur dann A aus, wenn (a) der Aufruf NSJSONSerialization selbst keine Fehler geworfen hat (d. H. Der JSON war wohlgeformt); aber (b) die Umwandlung in das Wörterbuch ist fehlgeschlagen (z. B. das JSON-Objekt der obersten Ebene war ein Array anstelle eines Wörterbuchs). Das ist ein extrem unwahrscheinliches Szenario (Ihr Server müsste versehentlich eine wohlgeformte JSON-Antwort zurückgeben, die kein Wörterbuch ist, beispielsweise ein JSON-Array).


Um das zu erreichen, was Sie wollen, würden Sie try? verwenden, um sicherzustellen, dass NSJSONSerialization keine Fehler werfen würde, selbst:

do { 
    guard let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else { 
     // A 
     throw JSONError.ConversionFailed 
    } 
} catch { 
    // B 
} 

Auf diese Weise nur, wenn A ein throw wird B führt heißt

+0

Danke dafür. Ich schätze diese Hilfe sehr. –