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.

Documentos relacionados