lo siento por mi mal inglés 🙂

Tengo un problema para analizar la respuesta JSON más de Alamofire en Swift para una aplicación para iOS. Escribí una función que devuelva una cadena de respuesta JSON. La solicitud y la respuesta de manejo hago con Alamofire y el manejo de JSON hago con SwiftyJSON. Al comenzar declaro un var llamado jsonString con el valor prueba. A continuación, hago una petición a un Servicio REST y obtener una respuesta JSON haciendo clic en un botón. Esta respuesta quiero volver con la función ping(url:String). Al final puedo imprimir la respuesta devuelta como una prueba. Pero en el primer clic en el botón, el valor de retorno de ping es prueba y no la cadena JSON de la respuesta. En el segundo clic en el botón de obtener el derecho de devolución de valor. Por qué tengo este problema. Es el Alamofire solicitud de una operación asincrónica? Quiero esperar la respuesta. ¿Cómo puedo solucionar el problema para obtener el valor correcto en primer clic y no prueba como valor?

Aquí está mi código:

var jsonString:String = "test"

func ping(url:String) -> String {

    Alamofire.request(.GET, url)
        .response {
            (request, response, data, error) -> Void in

            let json = JSONValue(data as? NSData)
            self.jsonString = json.rawJSONString
    }

    return self.jsonString
}

@IBAction func checkOnlineStatus(sender: UIButton) {

    let response:String = ping("http://test.com")

    println(response)}
InformationsquelleAutor Martin | 2014-09-21

4 Comentarios

  1. 3

    En el primer clic, el código

    return self.jsonString

    se ejecutará antes de

    .response {
            (request, response, data, error) -> Void in
    
            let json = JSONValue(data as? NSData)
            self.jsonString = json.rawJSONString
    }

    obtendrá nil forma el auto.jsonString en el primer tiempo, segundo clic obtener el primer lugar haga clic en la solicitud de datos.

    Si utiliza SwiftyJSON y Alamofire puede intentar Alamofire-SwiftyJSON

    • muchas gracias…voy a probarlo 🙂
  2. 1

    También puede intentar ejecutar

    dispatch_sync(dispatch_get_main_queue()) {
      //insert code you need done the first time around - it will wait
    }
  3. 0

    El problema que tiene es que usted está tratando de devolver el resultado de un método asincrónico de forma sincrónica.

    Tiene dos soluciones:

    1. Devolver el resultado de forma asincrónica
    2. Esperar la llamada asincrónica para completar

    He escrito una respuesta a esta misma pregunta hace unos minutos en este hilo, yo te sugiero que echa un vistazo: https://stackoverflow.com/a/33130512/422288

  4. 0
    pod 'Alamofire' 
    pod 'SwiftyJSON' 
    pod 'ReachabilitySwift'
    
    import UIKit import Alamofire import SwiftyJSON import SystemConfiguration
    
    class WebServiceHelper: NSObject {
    
    typealias SuccessHandler = (JSON) -> Void
    typealias FailureHandler = (Error) -> Void
    
    //MARK: - Internet Connectivity
    
    class func isConnectedToNetwork() -> Bool {
    
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
        zeroAddress.sin_family = sa_family_t(AF_INET)
    
        guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                SCNetworkReachabilityCreateWithAddress(nil, $0)
            }
        }) else {
            return false
        }
    
        var flags: SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
            return false
        }
    
        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)
    
        return (isReachable && !needsConnection)
    }
    
    //MARK: - Helper Methods
    
    class func getWebServiceCall(_ strURL : String, isShowLoader : Bool, success : @escaping SuccessHandler, failure : @escaping FailureHandler)
    {
        if isConnectedToNetwork() {
    
            print(strURL)
    
            if isShowLoader == true {
    
                AppDelegate.getDelegate().showLoader()
            }
    
            Alamofire.request(strURL).responseJSON { (resObj) -> Void in
    
                print(resObj)
    
                if resObj.result.isSuccess {
                    let resJson = JSON(resObj.result.value!)
    
                    if isShowLoader == true {
                        AppDelegate.getDelegate().dismissLoader()
                    }
    
                    debugPrint(resJson)
                    success(resJson)
                }
                if resObj.result.isFailure {
                    let error : Error = resObj.result.error!
    
                    if isShowLoader == true {
                        AppDelegate.getDelegate().dismissLoader()
                    }
                    debugPrint(error)
                    failure(error)
                }
            }
        }else {
    
    
            CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!)
        }
    }
    
    class func getWebServiceCall(_ strURL : String, params : [String : AnyObject]?, isShowLoader : Bool, success : @escaping SuccessHandler,  failure :@escaping FailureHandler){
        if isConnectedToNetwork() {
    
            if isShowLoader == true {
                AppDelegate.getDelegate().showLoader()
            }
    
    
            Alamofire.request(strURL, method: .get, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON(completionHandler: {(resObj) -> Void in
    
                print(resObj)
    
                if resObj.result.isSuccess {
                    let resJson = JSON(resObj.result.value!)
    
                    if isShowLoader == true {
                        AppDelegate.getDelegate().dismissLoader()
                    }
    
                    success(resJson)
                }
                if resObj.result.isFailure {
                    let error : Error = resObj.result.error!
    
                    if isShowLoader == true {
                        AppDelegate.getDelegate().dismissLoader()
                    }
    
                    failure(error)
                }
    
            })
        }
    else {
    
            CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!)
    }
    
    }
    
    
    
    class func postWebServiceCall(_ strURL : String, params : [String : AnyObject]?, isShowLoader : Bool, success : @escaping SuccessHandler, failure :@escaping FailureHandler)
    {
        if isConnectedToNetwork()
        {
    
            if isShowLoader == true
            {
                AppDelegate.getDelegate().showLoader()
            }
    
            Alamofire.request(strURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON(completionHandler: {(resObj) -> Void in
    
                print(resObj)
    
                if resObj.result.isSuccess
                {
                    let resJson = JSON(resObj.result.value!)
    
                    if isShowLoader == true
                    {
                        AppDelegate.getDelegate().dismissLoader()
                    }
    
                    success(resJson)
                }
    
                if resObj.result.isFailure
                {
                    let error : Error = resObj.result.error!
    
                    if isShowLoader == true
                    {
                        AppDelegate.getDelegate().dismissLoader()
                    }
    
                    failure(error)
                }
            })
        }else {
            CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!)
        }
    }
    
    
    class func postWebServiceCallWithImage(_ strURL : String, image : UIImage!, strImageParam : String, params : [String : AnyObject]?, isShowLoader : Bool, success : @escaping SuccessHandler, failure : @escaping FailureHandler)
    {
        if isConnectedToNetwork() {
            if isShowLoader == true
            {
                AppDelegate.getDelegate().showLoader()
            }
    
            Alamofire.upload(
                multipartFormData: { multipartFormData in
                    if let imageData = UIImageJPEGRepresentation(image, 0.5) {
                        multipartFormData.append(imageData, withName: "Image.jpg")
                    }
    
                    for (key, value) in params! {
    
                        let data = value as! String
    
                        multipartFormData.append(data.data(using: String.Encoding.utf8)!, withName: key)
                        print(multipartFormData)
                    }
                },
                to: strURL,
                encodingCompletion: { encodingResult in
                    switch encodingResult {
                    case .success(let upload, _, _):
                        upload.responseJSON { response in
                            debugPrint(response)
                            //let datastring = String(data: response, encoding: String.Encoding.utf8)
                           //print(datastring)
                        }
                    case .failure(let encodingError):
                        print(encodingError)
                        if isShowLoader == true
                        {
                            AppDelegate.getDelegate().dismissLoader()
                        }
    
                        let error : NSError = encodingError as NSError
                        failure(error)
                    }
    
                    switch encodingResult {
                    case .success(let upload, _, _):
                        upload.responseJSON { (response) -> Void in
    
                            if response.result.isSuccess
                            {
                                let resJson = JSON(response.result.value!)
    
                                if isShowLoader == true
                                {
                                    AppDelegate.getDelegate().dismissLoader()
                                }
    
                                success(resJson)
                            }
    
                            if response.result.isFailure
                            {
                                let error : Error = response.result.error! as Error
    
                                if isShowLoader == true
                                {
                                    AppDelegate.getDelegate().dismissLoader()
                                }
    
                                failure(error)
                            }
    
                        }
                    case .failure(let encodingError):
                        if isShowLoader == true
                        {
                            AppDelegate.getDelegate().dismissLoader()
                        }
    
                        let error : NSError = encodingError as NSError
                        failure(error)
                    }
                }
            )
        }
        else
        {
            CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!)
        }
    }
    }
    
    ================================== 

    Método De Llamada

    vamos a aParams : [String : String] = [ «ReqCode» : Constantes.kRequestCodeLogin, «StoreDCID» : strStoreID!, «CustEmail» : dictAddLogin[AddLoginConstants.kEmail]!, «Contraseña» : dictAddLogin[AddLoginConstants.kPassword]!, «DeviceID» : «DeviceIDString», «DeviceType» : «iOS», ]

            WebServiceHelper.postWebServiceCall(Constants.BaseURL, params: aParams as [String : AnyObject]?, isShowLoader: true, success: { (responceObj) in
    
    
                if "\(responceObj["RespCode"])" != "1"
                {
                    let alert = UIAlertController(title: Constants.kAppName, message: "\(responceObj["RespMsg"])", preferredStyle: UIAlertControllerStyle.alert)
                    let OKAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction!) in
                    }
                    alert.addAction(OKAction)
                    self.present(alert, animated: true, completion: nil)
                }
                else
                {
                    let aParams : [String : String] = [
                        "Password" : self.dictAddLogin[AddLoginConstants.kPassword]!,
                        ]
                    CommonMethods.saveCustomObject(aParams as AnyObject?, key: Constants.kLoginData)
    
                }
                }, failure:
                { (error) in
    
                    CommonMethods.showAlertWithError(Constants.kALERT_TITLE_Error, strMessage: error.localizedDescription,withTarget: (AppDelegate.getDelegate().window!.rootViewController)!)
            })
        }

Dejar respuesta

Please enter your comment!
Please enter your name here