2015-12-02 6 views
-2

у меня есть этот класс и его FUNCВызов функции и ждать его завершения

class DataUsuarios {  
    func update(completionHandler : ((isResponse : Array<JSON>) -> Void)) { 
     //CODE 
     completionHandler(isResponse: jsn) 
    } 
} 

и я называю его с этим

let data = DataUsuarios() 
data.update{(isResponse) -> Void in 
    self.datos = isResponse 
} 

и он работает как надо ..

Теперь у меня есть этот класс и функция, которые я сделал

import Foundation 

class Post{ 
func makeRequest(param : String, url : String, completionHandler : ((succeeded: Bool, msg: String? , crypted : String?) -> Void)) { 
    let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    let params : Dictionary<String, String> = ["VAL": param] 
    let session = NSURLSession.sharedSession() 
    session.configuration.timeoutIntervalForRequest = 3 //3 segundos timeoutRequest 
    session.configuration.timeoutIntervalForResource = 5 //5 segundos timeoutResource 
    request.HTTPMethod = "POST" 

    do{ 
     request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: .PrettyPrinted) 
    }catch let err as NSError { 
     print(err.localizedDescription) 
     print("Error could not make request'") 
     completionHandler(succeeded: false, msg: "Error al interpretar JSON" , crypted: nil) 

    } 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     print("Response: \(response)") 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)") 
     var json : NSDictionary? 
     do{ 
      json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary 
     }catch let err as NSError { 
      print(err.localizedDescription) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: '\(jsonStr)'") 
      completionHandler(succeeded: false, msg: "Error en POST", crypted: nil) 

     } 
     if let parseJSON = json { 

      if let encrypted = parseJSON["encriptado"] as? String { 
       let decrypted = encrypted.aesDecrypt() 
       let datosDecrypted: NSData = decrypted.dataUsingEncoding(NSUTF8StringEncoding)! 
       var jsonLogin:NSDictionary! 
       do{ 
        jsonLogin = try NSJSONSerialization.JSONObjectWithData(datosDecrypted , options:NSJSONReadingOptions.MutableContainers) as! NSDictionary 
       }catch let err as NSError { 
        print(err.localizedDescription) 
        print("Error could not make request'") 
        completionHandler(succeeded: false, msg: "Error" , crypted: nil) 

       } 
       if (jsonLogin.valueForKey("success") != nil) { 
        if let successNumber = jsonLogin.valueForKey("success") as! Int! { 

         print("Success: " , successNumber); 
         completionHandler(succeeded: true, msg: nil, crypted: decrypted) 
        } 
       } 
       completionHandler(succeeded: false, msg: "Error Success", crypted: nil) 
      } 
     } 
     else { 
      // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: \(jsonStr)") 
      completionHandler(succeeded: false, msg: "Error", crypted: nil) 
     } 

    }) 

    task.resume() 
} 
} 

, но я не знаю, как назвать это и получить completionHandler значения

let post = Post() 
post.makeRequest(cad, url: Constants.Static.server+"url.php" { succeeded, msg, crypted) -> Void in 

} 

Надеется, что вы можете помочь! :)

+0

Что именно проблема? «он не работает» определенно не достаточно конкретный. – jcaron

+0

Я предполагаю, что вы вставляете // CODE работает асинхронно. – HMHero

+0

ok, @jcaron, неправильный синтаксис, вызывающий функцию, просто говорит: 'Последовательные операторы в строке должны быть разделены ';'', я знаю, как вызвать функцию, когда она не требует параметров .. @HMHero, Yes , все работает внутри, оно было проверено перед тем, как сделать его функцией. –

ответ

0

Хорошо, я нашел, что это ..

post.makeRequest(cad, url: Constants.Static.server+"url.php"){(succedded : Bool, msg : String?, crypted:String?) in 
      if(succedded){ 
       // CODE USING CRYPTED 
      }else { 
       // CODE USING MSG 
      } 
     } 
0

Может быть, вы хотите dispatch_async():

func makeRequest(param : String, url : String, completionHandler : ((succeeded: Bool, msg: String? , crypted : String?) ->())) { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { 
     println("This is run on the background queue") 
     //CODE 
     dispatch_async(dispatch_get_main_queue(), 0), { 
      println("This is run on the main queue, after the previous block") 
      completionHandler(succeeded: true, msg: nil, crypted: decrypted) 
     } 
    } 
} 
+0

Спасибо за ваш ответ! У меня это под контролем, моя проблема вызывает функцию и ждет значений 'completitionHandler'. –

+0

См. Edit и дайте мне знать, если это поможет. –

Смежные вопросы