Vuelta rápida de datos de URLSession

No puedo devolver los datos de mi HTTPrequest y yo no puedo conseguir la finalización controladores para funcionar bien. Así que por favor me ayude en mi búsqueda de resolver este problema:

public static func createRequest(qMes: message, location: String, method: String) -> String{
    let requestURL = URL(string: location)
    var request = URLRequest(url: requestURL!)

    request.httpMethod = method
    request.httpBody = qMes.toString().data(using: .utf8)

    let requestTask = URLSession.shared.dataTask(with: request) {
        (data: Data?, response: URLResponse?, error: Error?) in

        if(error != nil) {
            print("Error: \(error)")
        }

        return String(data: data!, encoding: String.Encoding.utf8) as String!
    }
    requestTask.resume()
}

Es excpecting no nulo instrucción return en la función void. En este punto estoy despistado…

  • su return declaración está dentro de la finalización del bloque de la dataTask(with:completionHandler:) función; su público func createRequest no devuelve nada, mientras que las reclamaciones de devolución de una String
  • Simple de hacer: var webString = pruebe Cadena(contentsOf: URL(string: url)!)
InformationsquelleAutor Craz1k0ek | 2017-03-27

4 Kommentare

  1. 17

    Puede utilizar esta conclusión bloque método para enviar la respuesta final:

    Por Ejemplo:
    He vuelto de la Cadena en la finalización del bloque, después de la exitosa respuesta sin error, sólo tiene que pasar el resultado en el bloque.

      public func createRequest(qMes: String, location: String, method: String , completionBlock: @escaping (String) -> Void) -> Void
        {
    
            let requestURL = URL(string: location)
            var request = URLRequest(url: requestURL!)
    
            request.httpMethod = method
            request.httpBody = qMes.data(using: .utf8)
    
            let requestTask = URLSession.shared.dataTask(with: request) {
                (data: Data?, response: URLResponse?, error: Error?) in
    
                if(error != nil) {
                    print("Error: \(error)")
                }else
                {
    
                    let outputStr  = String(data: data!, encoding: String.Encoding.utf8) as String!
                    //send this block to required place
                    completionBlock(outputStr!);
                }
            }
            requestTask.resume()
        } 

    Puede utilizar esta a continuación el código a ejecutar por encima de la finalización de la función de bloqueo:

     self.createRequest(qMes: "", location: "", method: "") { (output) in
    
            }

    Que esto va a resolver su siguiente requisito.

  2. 2
    {
        (data: Data?, response: URLResponse?, error: Error?) in
    
        if(error != nil) {
            print("Error: \(error)")
        }
    
        return String(data: data!, encoding: String.Encoding.utf8) as String!
    }

    Esta parte del código es el controlador de finalización para la dataTask() método. Es un bloque de código que puede pasar en el dataTask() método que se ejecutará más tarde (cuando el servidor envía algunos datos o hay un error). No se ejecuta inmediatamente.

    Esto significa que cuando su createRequest() método sobre el que se está ejecutando, se pasa directamente sobre el código, a continuación, en la requestTask.resume() línea y, a continuación, el método termina. En ese punto, debido a que su método se define como la devolución de un String, usted necesita devolver un String. Volviendo desde el controlador de finalización no es bueno debido a que no se ha ejecutado todavía, que va a ser ejecutado más tarde.

    Hay un montón de diferentes maneras de manejar la programación asincrónica, sino una forma de afrontar este es cambiar su createRequest() método, de modo que no está definido para devolver un String, crear un método que toma un String como un parámetro que hace todo lo que quería hacer con el valor de retorno, y, a continuación, llamar a ese método de su controlador de finalización.

    • Gracias por la información extra, tuvo algunos problemas para la comprensión de este! Genial!!!
  3. 1

    Lugar de utilizar retorno, trate de usar la finalización de los manipuladores como usted menciona en su pregunta.

    func createRequest(qMes: message, location: String, method: String, completionHandler: @escaping (_ data:Data?, _ response: URLResponse?, _ error: NSError?) -> Void)

    A continuación, en lugar de return usted debe usar algo como completionHandler(data, response, error)

    Y esta es la manera de hacer la solicitud:

    var request = URLRequest(url: Foundation.URL(string: URL)!)
            request.httpMethod = method
            //request.addValue(authString, forHTTPHeaderField: "Authorization") //if you need some
    
            let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in
    
                guard error == nil && data != nil else
                {
                    print("error=\(error)")
                    completionHandler(data, response, error as NSError?)
                    return
                }
    
                completionHandler(data, response, error as NSError?)
            }) 
    
            task.resume()
  4. 1

    Sólo en la llamada a la función

    var webString = try String(contentsOf: URL(string: url)!)

    Y tiene plena respuesta en cadena, que puede volver

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea