Como utilizar Dropbox en nuestras aplicaciones, parte 2, por Angel Traversi

29/11/2011 por Carlos Burges

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:

- (void)viewDidLoad
{
    [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:

#import <DropboxSDK/DropboxSDK.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:

- (void)viewWillAppear:(BOOL)animated
{
    [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:

- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
    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:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    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:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 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:

- (void)restClient:(DBRestClient*)client loadedFile:(NSString*)localPath {
    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):

-(void)onUploadFile:(id)sender;
{
    // 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

0

Comentarios

  • #1 farun el 29/11/2011
    Yo la semana pasada trabajé en premiere teniendo tanto los brutos como el archivo del proyecto en dropbox y algo pasó que, en cierto momento, solo uno de los "premieres" podia leer el archivo. En las otras máquinas con las que sincronizaba el dropbox daba un error que ya es conocido por Adobe. Así que ojito que pueden pasar cosas raras.

    http://www.dodemo.es
  • #2 amt.desarrollos el 01/12/2011
    Hola Farun, yo tuve problemas el lunes mientras escribía el artículo. Pero entiendo que fue algo momentáneo.

Escribe un comentario

Regístrate o identifícate para poder comentar