2016-07-29 12 views
1

私は、NSURLSessionを通してapiが呼び出されるアプリケーションで作業しています。 APIが正しく動作する場合は問題ありませんが、何もデータがシリアル化した後、その後、何らかのエラーに受信されないとき、私がここで間違ってやっている何ブロックが正常に動作しない

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

と呼ばれることはありませんため、エラーが、他のブロックを投げます? ?

+0

どのブロックを実行すると思われますか?シリアル化が他の 失敗したときに、私はこれを実行することを期待 – dasblinkenlight

+0

@dasblinkenlightは、私が第三ガードブロックが呼び出された疑いがある –

+0

{ プリント(「シリアル化に失敗しました」)//このブロックは、シリアル化が スローが をJSONError.ConversionFailed失敗しても実行したことがありません}データがないとき –

答えて

1

は考えてみましょう:

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

NSJSONSerializationは(すなわち、それは本当にJSON応答しなかった場合または応答が不正だった場合)、エラーをスローした場合、それはBに直接進むだろうとguard文がありません遊びに来てください。 guardステートメントは、を実行するのは、(a)NSJSONSerialization呼び出し自体がエラーをスローしなかった場合です(つまり、JSONが整形式である場合)。 (b)辞書へのキャストが失敗した(トップレベルのJSONオブジェクトが辞書ではなく配列だったなど)それは非常にありそうもないシナリオです(JSON配列などの辞書ではなく、うまく作成されたJSON応答をサーバが返す必要があります)。


あなたは、あなたがNSJSONSerializationは、自分自身にエラーをスローしないことを確認するためにtry?を使用したいものを達成するために:Aが実行する場合にのみ、これを行うことにより

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

throwますB

+0

ありがとうございます。私は本当にこの助けに感謝します。 –

関連する問題