Yo siempre he usado la finalización de los manipuladores. Con NSURLConnection y ahora con NSURLSession. Se llevó a mi código está muy descuidado, especialmente me han pedido el plazo de solicitud el plazo de solicitud.

Quería probar el uso de delegados en NSURLSession a implementar algo que he hecho desordenado con NSURLConnection.

Así que he creado un NSURLSession, y creó un dataTask:

NSURLSessionDataTask *dataTask = [overallSession dataTaskWithURL:url
                                                  completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                      if(error == nil)
                                                      {
                                                          NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
                                                          NSLog(@"Data = %@",text);
                                                      }

                                                  }];

    [dataTask resume];

Ahora tengo una completionHandler para la respuesta, ¿cómo puedo cambiar a los delegados para gestionar la respuesta y los datos? Y puedo agregar otro dataTask del delegado de esta? El uso de las cookies que este dataTask creado y colocado en la sesión?

InformationsquelleAutor AndrewSB | 2014-03-26

1 Comentario

  1. 41

    Si quieres añadir una costumbre delegado de la clase, es necesario implementar la NSURLSessionDataDelegate y NSURLSessionTaskDelegate protocolos en el mínimo.

    Con los métodos:

    NSURLSessionDataDelegate – continua el estado de su solicitud

     - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response
     completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
    
        receivedData=nil; receivedData=[[NSMutableData alloc] init];
        [receivedData setLength:0];
    
        completionHandler(NSURLSessionResponseAllow);
    }

    NSURLSessionDataDelegate

    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
       didReceiveData:(NSData *)data {
    
        [receivedData appendData:data];
    }

    NSURLSessionTaskDelegate

     - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
    didCompleteWithError:(NSError *)error {
     if (error) {
      //Handle error
     }
    else {
       NSDictionary* response=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&tempError];
        //perform operations for the  NSDictionary response
    }

    Si quieres separar el código de delegado (capa media) de su clase de llamada (generalmente una buena práctica tener clase separada/capa de llamadas de la red), el delegado de NSURLSession tiene que ser :-

    NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:myCustomDelegateClass delegateQueue:nil];

    Ref Enlaces:

    1. NSURLSession De Referencia De La Clase
    2. iOS NSURLSession Ejemplo (HTTP GET, POST, Fondo Downlads )
    3. De NSURLConnection a NSURLSession
    • Si múltiples solicitudes simultáneas puede ser en vuelo al mismo tiempo, este enfoque no funciona ya que va a anexar los datos de las diferentes tareas en conjunto. En este caso, utilizar el diccionario para anexar sólo los datos que pertenecen a una determinada tarea.
    • gracias por el 2do link! ayudó mucho y era exactamente lo que necesitaba!
    • Muchas gracias…
    • Usted puede hacer todas esas cosas, pero en general menos que usted está haciendo de autenticación personalizado, personalizado almacenamiento en caché, o tratando de hacer uso de los datos antes de que usted reciba todos los de éste (por ejemplo parcial de análisis de una página web antes de iniciar el procesamiento), es por lo general más limpio para el uso de las devoluciones de llamada y entregar los datos resultantes de un método si las cosas se ponen demasiado profundamente anidadas y confuso. Sólo mi $0.02.
    • en caso de que el delegado de las devoluciones de llamada configurado para volver en la cola principal, el [receivedData appendData:datos]; puede ser una operación costosa, por lo que debe ser movido a la cola global de una manera asíncrona y se le debe sumar un bloqueo;

Dejar respuesta

Please enter your comment!
Please enter your name here