Pregunta

Acabo de empezar a utilizar AFNetworking y hasta ahora ha funcionado bien para solo obtener los datos de la web.

Pero ahora tengo una lista de archivos que necesitan ser descargadas en el dispositivo

for(NSDictionary *issueDic in data)
{
    Issue *issue = [[Issue alloc] init];
    ...
    [self getOrDownloadCover:issue];
    ...
}

getOrDownloadCover:problema comprueba si ya existe un archivo local, si lo hace, simplemente se ahorra ese camino, si no, descarga el archivo desde una url determinada

- (void)getOrDownloadCover:(Issue *)issue
{
    NSLog(@"issue.thumb: %@", issue.thumb);

    NSString *coverName = [issue.thumb lastPathComponent];

    NSLog(@"coverName: %@", coverName);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    __block NSString *filePath = [documentsDirectory stringByAppendingPathComponent:coverName];

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        // Cover already exists
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    }
    else 
    {
        NSLog(@"load thumb");

        // Download the cover
        NSURL *url = [NSURL URLWithString:issue.thumb];
        AFHTTPClient *httpClient = [[[AFHTTPClient alloc] initWithBaseURL:url] autorelease];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:issue.thumb parameters:nil];

        AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"FAILED");
    }];
        [operation start];
    }
}

getOrDownloadCover:problema puede ser llamado 20 veces en una fila, por lo que tendría que poner todas mis peticiones en cola, y una vez que la cola se haya completado, debe ser capaz de guardar la ruta (o simplemente enviar una notificación, ya que yo ya sé lo que el camino es)

Alguna sugerencia para esto?

¿Fue útil?

Solución

Añadir un NSOperationQueue a un objeto se puede obtener la instancia de en cualquier momento de su aplicación, por ejemplo en el appDelegate.A continuación, añadir la de AFHTTPRequestOperation a esta cola como:

[[(AppDelegate *) [UIApplication sharedApplication].delegate operartionQueue] addOperation:operation];

Simplemente gestionar el ahorro en la realización de bloque, o llamar a un método de este bloque en el hilo principal o un post NSNotification.

Para llamar el hilo principal uso GCD :

dispatch_async(dispatch_get_main_queue(), ^{
    // Call any method from on the instance that created the operation here.
    [self updateGUI]; // example
});

Otros consejos

No estoy seguro de si esto es útil pero ...

En lugar de usar su propia operación, podría usar la operación de AfhttpClient.Operaciones individuales enquemonadas con enquespoperación o enquema Una matriz de operaciones con enlacueBatchoperations (estoy recordando estos nombres de métodos de la memoria, probablemente fuera un poco).

En cuanto al almacenamiento de datos específicos de cada operación, podría subclase AFHTTPREstOrteleration y establecer propiedades para la ruta que desea almacenar.Algo como esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top