Como utilizar Dropbox en nuestras aplicaciones, parte 2, por Angel Traversi
Continuamos con el ejemplo de la semana pasada. Ya sabemos como loggearnos a Dropbox. Ahora es momento de operar con el servicio.
Les comenté sobre 3 servicios fundamentales: loadMetadata, que enumera los archivos de una carpeta, loadFile, que permite descargar un archivo a nuestro dispositivo y uploadFile, que permite subir un archivo a la nube
La idea es visualizar la lista de archivos de la carpeta DropBox en el MasterViewController.
Las 3 operaciones citadas las maneja el DBRestClient (DB de DropBox y no de base de datos!!). Asi que, creamos una instancia DBRestClient en el viewDidLoad de MasterViewController para tenerla disponible durante toda la vida del controller:
{
[super viewDidLoad];
restClient =
[[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
restClient.delegate = self;
}
Como ven, es necesario indicarle un objeto session que va a representar al loggin. Además, adherimos al delegate DBRestClientDelegate, fundamental para cualquiera de las 3 operaciones citadas y que veremos en detalle más abajo.
En el .H:
@interface MasterViewController : UITableViewController <DBRestClientDelegate>
{
DBRestClient *restClient;
}
Listado de archivos
Como indiqué anteriormente, loadMetadata retorna los archivos presentes en una carpeta. La invocamos en el viewWillAppear pasando el directorio raíz de la carpeta de la aplicación:
{
[super viewWillAppear:animated];
[restClient loadMetadata:@"/"];
}
El resultado de la operación vuelve via delegate, en loadedMetadata si está OK, o en loadMetadataFailedWithError si hay error. La lista de archivos está en el objeto DBMetadata:
self.files = metadata.contents;
[self.tableView reloadData];
}
- (void)restClient:(DBRestClient *)client
loadMetadataFailedWithError:(NSError *)error {
NSLog(@"loadMetadataFailedWithError: %@", error);
}
nos quedamos con la lista en un NSArray y la mostramos en el cellForRowAtIndexPath:
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
// Configure the cell.
DBMetadata *file = [self.files objectAtIndex:indexPath.row];
cell.textLabel.text = file.filename;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@, %@", file.humanReadableSize, file.lastModifiedDate];
return cell;
}
Mostrar un archivo
Cuando seleccionamos un archivo de la TableView, éste se visualizará en el DetailViewController. Escribo el código solo para imágenes, ustedes generalicen para cualquier caso. Inicio la descarga en didSelectRowAtIndexPath:
{
// obtengo el archivo seleccionado
DBMetadata *file = [self.files objectAtIndex:indexPath.row];
// obtengo el directorio Documents
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// hago la descarga en él
[restClient loadFile:file.path intoPath:[documentsDirectory stringByAppendingPathComponent:file.path]];
}
Atentos al método del delegate loadedFile que nos informa del archivo descargado con éxito y loadFileFailedWithError si hubo error:
if (!self.detailViewController) {
self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease];
}
// creo la UIImage en base al archivo descargado
self.detailViewController.imageView.image = [UIImage imageWithContentsOfFile:localPath];
[self.navigationController pushViewController:self.detailViewController animated:YES];
}
- (void)restClient:(DBRestClient*)client loadFileFailedWithError:(NSError*)error {
NSLog(@"loadFileFailedWithError - %@", error);
}
Subir archivo a DropBox
Para terminar, les muestro la API para subir un archivo a Dropbox. En el ejemplo, tomo un archivo fijo que he incluido en el mainBundle, ustedes seleccionen el archivo de una mejor manera.
Además, hay que implementar dos métodos del delegate, uno para saber que el upload terminó satisfactoriamente (uploadedFile) y el otro para determinar si terminó con error (uploadFileFailedWithError):
{
// subo a DropBox un archivo fijo del mainBundle
[restClient uploadFile:@"3086.png" toPath:@"/"
withParentRev:nil fromPath:[[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"]];
}
- (void)restClient:(DBRestClient*)client uploadedFile:(NSString*)destPath
from:(NSString*)srcPath metadata:(DBMetadata*)metadata {
NSLog(@"uploadedFile: %@", metadata.path);
}
- (void)restClient:(DBRestClient*)client uploadFileFailedWithError:(NSError*)error {
NSLog(@"uploadFileFailedWithError: %@", error);
}
Listo!, ahora es el turno de ustedes. Experimenten y evalúen DropBox, que sin duda se perfila como una buena alternativa de tener archivos de apps en la nube.
Hasta la próxima!
Un artículo de Angel Traversi






http://www.dodemo.es