2016-02-16 3 views
0

J'ai une fonction qui parse JSON, mais je reçois une erreur nulle portant sur les chaînes d'URL:Swift n'attraper dans la fonction ne fonctionne pas

var jsonResponse: NSMutableDictionary? 
do{ 
    jsonResponse = try NSJSONSerialization.JSONObjectWithData(data!, 
     options: NSJSONReadingOptions.AllowFragments) as? NSMutableDictionary; 

    let info : NSArray = jsonResponse!.valueForKey("latest_receipt_info") as! NSArray 
    let transaction_id: String? = info[0].valueForKey("transaction_id") as? String 
    let purchase_date: String? = info[0].valueForKey("purchase_date") as? String 
    let product_id: String? = info[0].valueForKey("product_id") as? String 
    let web_order_line_item_id: String? = info[0].valueForKey("web_order_line_item_id") as? String 

    print("test") 

    // Send Values 

    let addIAPUrl:NSString = "http://bla.com/application/addIAP.php?transaction_id=\(transaction_id!)&purchase_date=\(purchase_date)&product_id=\(product_id)&web_order_line_item_id=\(web_order_line_item_id)&userID=\(prefs.valueForKey("userID") as! String!)" 
    self.apiRequests(addIAPUrl as String, completionHandler: { (success, message) -> Void in 

      print("success \(addIAPUrl)") 

     if(success == 1){ 

      dispatch_async(dispatch_get_main_queue()){ 

       // ADDED 
       print("success \(addIAPUrl)") 

      } 

     }else{ 

      // DONT ADDED 
     } 



    }) 

La sortie ne retourne pas d'erreur, mais la fonction échoue après print ("test"). La fonction apiRequests fonctionne dans d'autres cas, mais ne semble pas fonctionner dans ce contexte.

J'apprécierais toute aide pour trouver le problème.

Voici le code de la fonction apiRequest:

func apiRequests(url : String, completionHandler : ((success : Int, message : String) -> Void)) { 

     guard let url = NSURL(string: url as String) else { 

      return 
     } 

     let urlRequest = NSURLRequest(URL: url) 
     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession(configuration: config) 

     let task = session.dataTaskWithRequest(urlRequest, completionHandler: { (data, response, error) in 
      guard let responseData = data else { 

       return 
      } 
      guard error == nil else { 

       print(error) 
       return 
      } 

      let post: NSDictionary 
      do { 
       post = try NSJSONSerialization.JSONObjectWithData(responseData, 
        options: []) as! NSDictionary 
      } catch { 

       return 
      } 

      let numberFromString = Int((post["success"] as? String)!) 


      completionHandler(success: (numberFromString)!, message: (post["message"] as? String)!) 



     }) 
     task.resume() 

    } 
+0

Quoi et où est exactement l'erreur que vous obtenez? – thislooksfun

+0

@thislooksfun je n'ai pas eu d'erreur ne pas exécuter la fonction self.apiRequests – SwiftDeveloper

+0

Avez-vous 'attraper quelque chose dans le premier extrait? – vadian

Répondre

1

Il me semble que le problème est plus probable que votre fonction apiRequests: est erroring à l'un des nombreux endroits, et est de retour au lieu d'appeler votre rappel avec un état d'erreur.

func apiRequests(url : String, completionHandler : ((success : Int, message : String) -> Void)) { 

    guard let url = NSURL(string: url as String) else { 
     completionHandler(0, "Couldn't get URL") 
     return 
    } 

    let urlRequest = NSURLRequest(URL: url) 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config) 

    let task = session.dataTaskWithRequest(urlRequest, completionHandler: { (data, response, error) in 
     guard let responseData = data else { 
      completionHandler(0, "Data was nil") 
      return 
     } 
     guard error == nil else { 
      print(error) 
      completionHandler(0, "Error wasn't nil") 
      return 
     } 

     let post: NSDictionary 
     do { 
      post = try NSJSONSerialization.JSONObjectWithData(responseData, 
       options: []) as! NSDictionary 
     } catch { 
      completionHandler(0, "Error with NSJSONSerialization") 
      return 
     } 

     let numberFromString = Int((post["success"] as? String)!) 


     completionHandler(success: (numberFromString)!, message: (post["message"] as? String)!) 



    }) 
    task.resume() 

} 

Side note, mais sans rapport avec le correctif,

let addIAPUrl:NSString = "http://bla.com/application/addIAP.php?transaction_id=\(transaction_id!)&purchase_date=\(purchase_date)&product_id=\(product_id)&web_order_line_item_id=\(web_order_line_item_id)&userID=\(prefs.valueForKey("userID") as! String!)" 
self.apiRequests(addIAPUrl as String, completionHandler: { (success, message) -> Void in 

Peut facilement être remplacé par

let addIAPUrl = "http://bla.com/application/addIAP.php?transaction_id=\(transaction_id!)&purchase_date=\(purchase_date)&product_id=\(product_id)&web_order_line_item_id=\(web_order_line_item_id)&userID=\(prefs.valueForKey("userID") as! String!)" 
self.apiRequests(addIAPUrl, completionHandler: { (success, message) -> Void in 

Parce que vous transformez un String à un NSString puis retour à a String

+0

merci im essayer – SwiftDeveloper

+0

C'est pourquoi j'ai abandonné l'écriture de mon propre api et juste utiliser [SwiftyJson] (https://github.com/SwiftyJSON/SwiftyJSON) – MwcsMac

+0

@thislooksfun grand mec – SwiftDeveloper