Presentamos el paquete de solicitudes web NSURLSESSION

Presentamos el paquete de solicitudes web NSURLSESSION

  Ayer traduje un artículo sobre "Uso de NSURLSession", dirección: http://www.cnblogs.com/JackieHoo/p/4995733.html, el texto original es del artículo oficial de Apple sobre el principio de la tecnología NSURLSession para lograr solicitudes de red, en el artículo Se menciona que la tecnología de solicitud de red NSURLSession es una suite de NSURLSession esta nueva clase y sus clases relacionadas. En el artículo de hoy, me centraré en varias clases importantes de la suite NSURLSession.

  Primero miramos la siguiente imagen:

 

 

 

  En la figura se puede ver que NSURLSession se compone principalmente de NSURLSessionConfiguration y un proxy opcional. Para completar la solicitud de red, necesitamos crear un objeto NSURLSessionTask.

 

NSURLSessionConfiguration

 

  Hay tres formas de crear NSURLSessionConfiguration:

1.defaultSessionConfiguration 

2.Configuración de sesión efímera

3.Configuración de sesión de fondo

  Estos tres métodos se han introducido en el artículo anterior. Después de crear NSURLSessionConfiguration, también podemos establecer algunas de sus otras propiedades, como varias propiedades comunes en el siguiente código:

 

Copiar codigo
 

NSURLSessionConfiguration * sessionConfig = 

[NSURLSessionConfiguration defaultSessionConfiguration]; 

 

// No se permite ninguna red móvil, solo se permite la solicitud de red de operación WIFI. 

sessionConfig.allowsCellularAccess = NO; 

 

// Permitir solo aceptar datos json 

[sessionConfig setHTTPAdditionalHeaders: 

          @ { @ " Accept " : @ " application / json " }]; 

 

// Establecer el tiempo de espera de la solicitud en 30 segundos 

sessionConfig.timeoutIntervalForRequest = 30.0 ; 

/ / Establecer el tiempo máximo para el procesamiento de recursos 

sessionConfig.timeoutIntervalForResource = 60.0 ; 

// Establecer el número máximo de conexiones para la aplicación a un solo host

sessionConfig.HTTPMaximumConnectionsPerHost = 1 ;
Copiar codigo

 

 

  Por supuesto, hay otros atributos, puede consultar el documento para obtener más información.

 

NSURLSession

 

  NSURLSession está diseñado para reemplazar la tecnología NSURLConnection. La sesión maneja las solicitudes de red a través de su objeto NSURLSessionTask de tareas. Con NSURLSession puede utilizar fácilmente métodos de bloqueo, agentes, etc. Pongamos un ejemplo:

Copiar codigo
// 百度图标的图片地址

NSString *imageUrl =

@"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";

 

// 会话配置设置为默认配置

NSURLSessionConfiguration *sessionConfig =

  [NSURLSessionConfiguration defaultSessionConfiguration];

 

// 使用默认配置初始化会话

NSURLSession *session =

  [NSURLSession sessionWithConfiguration:sessionConfig

                                delegate:self

                           delegateQueue:nil];

 

 

// 创建 下载图片任务

NSURLSessionDownloadTask *getImageTask =

[session downloadTaskWithURL:[NSURL URLWithString:imageUrl]

 

    completionHandler:^(NSURL *location,

                        NSURLResponse *response,

                        NSError *error) {

        

// 图片下载完成执行的block,在这里我们处理图片

        UIImage *downloadedImage =

          [UIImage imageWithData:

              [NSData dataWithContentsOfURL:location]];

      //主线程更新界面

      dispatch_async(dispatch_get_main_queue(), ^{

        // 

        _imageView.image = downloadedImage;

      });

}];

 

// 记住,任务默认是挂起状态的,创建任务后,如果需要立即执行,需要调用resume方法

[getImageTask resume];
Copiar codigo

 

 

 

实现NSURLSessionDownloadDelegate

 

  我们可以实现这个代理方法,通知下载任务完成:

 

Copiar codigo
-(void)URLSession:(NSURLSession *)session

     downloadTask:(NSURLSessionDownloadTask *)downloadTask

didFinishDownloadingToURL:(NSURL *)location

{

  //下载完成时调用

}
Copiar codigo

 

 

 

  也可以实现这个代理来跟踪下载进度:

 

Copiar codigo
 

-(void)URLSession:(NSURLSession *)session

     downloadTask:(NSURLSessionDownloadTask *)downloadTask

     didWriteData:(int64_t)bytesWritten

totalBytesWritten:(int64_t)totalBytesWritten

totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

{

  NSLog(@"%f / %f", (double)totalBytesWritten,

    (double)totalBytesExpectedToWrite);

}
Copiar codigo

 

 

 

 

NSURLSessionTask

 

 

  我们常用NSURLSessionDataTask、NSURLSessionDownloadTask、NSURLSessionUploadTask任务,其实他们有一个共同的父类NSURLSessionTask。他们的继承关系入下图所示:

 

 

  图中已经明确说明了他们之间的继承关系,下面我们来介绍一下这个几个任务的不同作用:

 

 

NSURLSessionDataTask

 

 

  这个任务类是用来发器http的get请求,然后下载NSData类型的数据的。然后我们将数据转换成XML,JSON,UIImage,plist等对应的类型。使用方法如下:

 

Copiar codigo
NSURLSessionDataTask *jsonData = [session dataTaskWithURL:yourNSURL

      completionHandler:^(NSData *data,

                          NSURLResponse *response,

                          NSError *error) {

        // 我们在这例处理NSData为正确的数据类型

}];
Copiar codigo

 

 

NSURLSessionUploadTask

 

 

顾名思义,这个任务类主要是用来通过post和put上传数据到web服务器的。它的代理方法还可以允许程序了解网络传输状态的。下面示范一个上传图片的例子的使用方法:

 

 

Copiar codigo
NSData *imageData = UIImageJPEGRepresentation(image, 0.6);

 

NSURLSessionUploadTask *uploadTask =

  [upLoadSession uploadTaskWithRequest:request

                              fromData:imageData];
Copiar codigo

 

 

 

 

NSURLSessionDownloadTask

 

  La descarga húmeda de archivos de la clase NSURLSessionDownloadTask se vuelve súper simple y permite al programa controlar la pausa y el inicio de la descarga en cualquier momento. Esta subcategoría es ligeramente diferente de la categoría de tareas anterior de Sonata:

1. Escribe el contenido descargado en un archivo temporal.

2. Durante el proceso de descarga, la sesión llamará al método URLSession: downloadTask: didWriteData: totalBytesWritten: totalBytesExpectedToWrite: para actualizar la información de estado.

3. Cuando se complete la descarga de la tarea, se llamará al método URLSession: downloadTask: didFinishDownloadingToURL :. En este momento, es mejor mover el archivo de una ubicación temporal a una ubicación permanente, o abrirlo inmediatamente para procesarlo.

4. Cuando la descarga falla o se cancela, los datos que puede obtener el programa pueden continuar para reanudar la descarga.

 

  Estas funciones son muy útiles, pero es importante recordar que todas estas tareas se suspenden por defecto cuando se crean, para que sean efectivas se debe ejecutar el método resume, por ejemplo:

 

[uploadTask resume];

 

 

  Bueno, aquí se presentan las clases principales necesarias para implementar la tecnología de solicitud de red de la suite NSURLSession. En el próximo artículo, usaré un ejemplo completo para usar realmente la suite NSURLSession e implementar solicitudes de red.

Supongo que te gusta

Origin blog.csdn.net/qq_27740983/article/details/51348333
Recomendado
Clasificación