2016-09-27 8 views
-1

完了ハンドラSwift3閉鎖クラッシュ

func sessionTaskPostRequest (_ urlRequest : URLRequest , responseHandler: @escaping ResponseHandler) -> URLSessionTask { 
    // 5 
    let sesstionTask : URLSessionTask = networkSession.dataTask(with: urlRequest, completionHandler: { (data : Data? , urlResponse : URLResponse? , error : NSError?)  in 

     var json: NSDictionary! 
     do { 
      json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions()) as? NSDictionary 
     } catch { 
      print(error) 
     } 

     // Did the JSONObjectWithData constructor return an error? If so, log the error to the console 
     if(error != nil) { 
      responseHandler (false , nil , error , nil) 
     } 
     else { 
      // The JSONObjectWithData constructor didn't return an error. But, we should still 
      // check and make sure that json has a value using optional binding. 
      if let parseJSON = json { 
       let errorJSON = parseJSON ["Err"] as! String 
       if !errorJSON.isEmpty { 
        responseHandler (false , nil , nil , errorJSON) 
       }else { 
        responseHandler (true , parseJSON , nil , nil) 
       } 
       print("Succes: \(parseJSON)") 
      } 
      else { 
       // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? 
       let jsonStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
       responseHandler (false , nil , error , "Error could not parse JSON") 
       print("Error could not parse JSON: \(jsonStr)") 
      } 
     } 
    } as! (Data?, URLResponse?, Error?) -> Void) 

    return sesstionTask 

} 

とURLSessionTaskのインスタンスを作成中にクラッシュし、応答JSONオブジェクトを返すレスポンスハンドラの型エイリアスを作成しました。タイプの別名

typealias ResponseHandler = (_ successFlag :Bool , _ data : NSDictionary? , _ errorObject : NSError? , _ errorString : String?) -> Void 
+0

どのラインにクラッシュがありますか – Avt

+0

} (Data?、URLResponse?、Error?) - > Void) –

答えて

0

レスポンスハンドラがエラーオブジェクトがnilである場合にクラッシュしてしまいますどのNSErrorとしてエラーオブジェクトを取得しているように思えるとNSError

にキャストすることができなかった

エラー= nilの を次のように、あなたが受け取るときそれはNSErrorとしてタイプキャストは失敗しますが、タイプキャストを実行しないと同じことが賢明に処理されます。