Question

Je viens de commencer à utiliser AFNetworking et jusqu'à présent, cela a bien fonctionné pour obtenir uniquement des données sur le Web.

Mais maintenant, j'ai une liste de fichiers qui doivent être téléchargés sur l'appareil

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

getOrDownloadCover:issue vérifie si un fichier existe déjà localement, si c'est le cas, il enregistre simplement ce chemin, si ce n'est pas le cas, il télécharge le fichier à partir d'une URL donnée

- (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:issue peut être appelé 20 fois de suite, je devrais donc mettre toutes mes demandes dans une file d'attente, et une fois la file d'attente terminée, il devrait toujours pouvoir enregistrer le chemin (ou simplement envoyer une notification, car Je sais déjà quel est le chemin)

Des suggestions à ce sujet ?

Était-ce utile?

La solution

Ajouter un NSOperationQueue à un objet dont vous pouvez obtenir l'instance à tout moment dans votre application, par exemple dans votre appDelegate.Ensuite, ajoutez simplement le AFHTTPRequestOperation à cette file d'attente comme :

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

Gérez simplement la sauvegarde dans le bloc de complétion, soit appelez une méthode à partir de ce bloc sur le thread principal, soit publiez un NSNotification.

Pour appeler le thread principal, utilisez GCD :

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

Autres conseils

Je ne sais pas si cela est utile mais ...

Au lieu d'utiliser votre propre opérationQueue, vous pouvez utiliser le fonctionnement de l'AFHTTPClient.Enqueue opérations simples avec Enqueuehttpopopopopopopopopopopopopopoper ou en faisue d'une gamme d'opérations avec Enqueuebatchoperations (je rappelle ces noms de méthodes de la mémoire, probablement un peu).

En ce qui concerne le stockage de données spécifique à chaque opération, vous pouvez sous-classer AFHTTTPRequestoperation et définir les propriétés du chemin que vous souhaitez stocker.Quelque chose comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top