Servicios Web iOS
Transcripción
Servicios Web iOS
Servicios Web iOS Índice 1 Introducción..................................................................................................................2 2 Ejercicios...................................................................................................................... 2 2.1 Añadimos la clase ImageDownloader y modificamos la clase UALibro................ 2 2.2 Creando la llamada al Servicio Web (0,5 puntos)................................................... 2 2.3 Añadimos los métodos del protocolo NSURLConnection (0,5 puntos)..................3 2.4 Implementamos la carga de imágenes de portada asíncrona (0,5 puntos)...............3 2.5 Integrando la carga de imágenes en nuestra colección (0,5 puntos)........................5 2.6 Modificando las vistas de detalle del libro (0,5 puntos).......................................... 5 2.7 Integrando Twitter (0,5 puntos)............................................................................... 5 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved. Servicios Web iOS 1. Introducción En esta sesión del proyecto de integración vamos a aplicar lo estudiado en el módulo de servicios web en nuestro proyecto de biblioteca de libros. También integraremos Twitter posibilitando al usuario publicar un libro en la red social. Usaremos los servicios web de jtech para obtener los libros disponibles para agregar a nuestra colección. 2. Ejercicios Una vez finalizados los ejercicios obtendremos el listado de libros disponibles desde el servicio web de jtech y podremos compartir un libro por Twitter desde la vista del detalle del libro ¡Comenzamos! 2.1. Añadimos la clase ImageDownloader y modificamos la clase UALibro En este primer ejercicio vamos a modificar la clase UALibro añadiéndole un nuevo atributo llamado imagenPortada de tipo UIImage que nos facilitará más adelante la carga asíncrona de las portadas. Añadimos al proyecto una clase helper que se encargará de descargar las imágenes de las portadas. Podemos descargar la clase desde aqui Ahora modificamos la clase UALibro añadiéndole un nuevo atributo que vamos a llamar imagenPortada que será de tipo UIImage. 2.2. Creando la llamada al Servicio Web (0,5 puntos) En este ejercicio vamos a crear la llamada al servicio web de libros de jtech, para ello añadimos las siguientes líneas de código a la controladora AgregarViewController.m: NSURL *url = [NSURL URLWithString: @"http://server.jtech.ua.es:80/jbib-rest/resources/libros"]; NSURLRequest *theRequest = [NSURLRequest requestWithURL: url]; NSURLConnection *theConnection = [NSURLConnection connectionWithRequest: theRequest delegate: self]; [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; Ahora deberemos de añadir los objetos necesarios para gestionar la conexión en el fichero AgregarViewController.h: @property(nonatomic,retain) NSURLConnection *currentConnection; //conexión @property(nonatomic,retain) NSMutableData *downloadedData; //datos que se van descargando 2 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved. Servicios Web iOS @property(nonatomic,retain) NSMutableDictionary *downloadingImages; //imagenes descargadas Modficamos ahora el fichero AgregarViewController.m: // Importamos las librerias necesarias #import "ImageDownloader.h" // Definimos los synthesize @synthesize currentConnection = _currentConnection; @synthesize downloadedData = _downloadedData; @synthesize downloadingImages = _downloadingImages; 2.3. Añadimos los métodos del protocolo NSURLConnection (0,5 puntos) Una vez que hemos creado la llamada al servicio web y hemos definido los objetos para gestionarla, vamos a programar los métodos necesarios del protocolo de la clase NSURLConnection. Debemos de completar los siguientes métodos escribiendo el código necesario: #pragma mark - Eventos de la conexion al servicio - (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // TODO: Añadimos el data al objeto downloadedData } - (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; self.currentConnection = nil; } - (void) connectionDidFinishLoading:(NSURLConnection *)connection { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // TODO: Parseamos el objeto JSON que tenemos en self.downloadedData y recorremos // todos los libros añadiéndolos al array de libros de la clase [self.tableView reloadData]; } 2.4. Implementamos la carga de imágenes de portada asíncrona (0,5 puntos) 3 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved. Servicios Web iOS En este punto vamos a implementar la carga de imágenes asíncrona para los libros. La carga de imágenes la realizaremos de la siguiente manera: al cargar una celda de la tabla comprobaremos si la imagen de la portada del libro (atributo imagenPortada) no existe, si es así cargaremos la imagen de modo asíncrono. En caso contrario mostraremos la imagen que tenemos en el objeto. Para implementar este punto añadiremos los dos siguientes métodos al final de la controladora UAAgregarViewController: - (void) imagenCargada: (id) sender { UALibro *libro = [sender object]; libro.imagenPortada = [sender image]; [self.tableView reloadData]; } - (void) cargarImagen: (UALibro *) libro { if([self.downloadingImages objectForKey: libro.isbn] == nil) { NSString *urlString = [NSString stringWithFormat: @"http://server.jtech.ua.es:8080/jbib-rest/resources/libros/%@/imagen", libro.isbn]; ImageDownloader *theDownloader = [[ImageDownloader alloc] initWithUrl:urlString object:libro target:self selector: @selector(imagenCargada:)]; [self.downloadingImages setValue: theDownloader forKey: libro.isbn]; } } También deberemos de actualizar el método cellForRowAtIndexPath añadiendo el siguiente fragmento de código justo antes de return cell; if (libro.imagenPortada == nil){ cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"]; // Carga de la imagen [self cargarImagen:libro]; } else { cell.imageView.image = libro.imagenPortada; } Por último deberemos inicializar el NSMutableDictionary dentro del método viewDidLoad, por lo que el método quedaría de la siguiente manera: - (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString: 4 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved. Servicios Web iOS @"http://server.jtech.ua.es:80/jbib-rest/resources/libros"]; NSURLRequest *theRequest = [NSURLRequest requestWithURL: url]; NSURLConnection *theConnection = [NSURLConnection connectionWithRequest: theRequest delegate: self]; [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; self.currentConnection = theConnection; self.downloadedData = [NSMutableData data]; // Inicializamos el diccionario self.downloadingImages = [[NSMutableDictionary alloc] init]; } 2.5. Integrando la carga de imágenes en nuestra colección (0,5 puntos) Al igual que hemos realizado en el punto anterior, escribiremos el mismo código en la controladora UAColeccionViewController para cargar las imágenes de las portadas de forma asíncrona. Esto deberemos hacerlo así porque las imágenes no las almacenamos en la base de datos de Core Data. LLegados a este punto podemos probar la carga de imágenes asíncrona. Las imágenes se deben de cargar una sóla vez. 2.6. Modificando las vistas de detalle del libro (0,5 puntos) Si entramos en la vista de detalle de algún libro veremos que la imagen de la portada no se carga, esto es porque debemos de asignar la imagen de la vista (el outlet) al atributo imagenPortada del libro. Para hacer esto deberemos de modificar el código necesario en las controladoras UANuevoLibroViewController y UADatosLibroViewController. 2.7. Integrando Twitter (0,5 puntos) En este último ejercicio de esta sesión del proyecto integraremos Twitter en nuestra aplicación de la biblioteca. Crearemos un botón en la parte superior derecha de la vista UADatosLibroViewController en el que cuando pulsemos sobre el nos aparecerá la interfaz de Twitter de iOS 5 para publicar un Tweet sobre el libro. Para ello realizaremos los siguientes pasos: • a) Importamos el framework de Twitter (Twitter.framework) al proyecto. • b) Creamos un botón de tipo UIBarButtonItem con el título "Twitter" y que ejecute la acción publicarEnTwitter • c) Añadimos el botón a derecha de la barra de navegación. • d) Implementamos el método publicarEnTwitter para que muestre la interfaz de Twitter de iOS 5 con un texto predeterminado y la imagen de la portada del libro. Framework Social.framework en iOS 6 5 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved. Servicios Web iOS iOS 6 incorporó un nuevo framework a su SDK: Social.framework. Usando este framework podemos integrar en nuestras aplicaciones Twitter, Facebook y Sina Weibo. Si lo deseamos podemos usar este framework en vez de el de Twitter. El framework Social.framework hace uso de la controladora SLComposeViewController para conectar con las redes sociales. 6 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved. Servicios Web iOS 7 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.