Domanda

Ho appena iniziato a utilizzare Afnetworking e finora ha funzionato bene per aver appena ricevuto i dati dal web.

Ma ora ho un elenco di file che devono essere scaricati sul dispositivo

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

GetDownloadCover: I controlli di emissione Se un file esiste già localmente, se lo fa, salva solo quel percorso, se non lo è, scarica il file da un determinato URL

- (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];
    }
}
.

GetDownloadcover: il problema può essere chiamato 20 volte di seguito, quindi dovrei mettere tutte le mie richieste in una coda e una volta completata la coda, dovrebbe essere ancora in grado di salvare il percorso (o semplicemente inviare aNotifica, dal momento che so già cosa è il percorso)

Qualche suggerimento per questo?

È stato utile?

Soluzione

Aggiungi un NSOperationQueue A un oggetto è possibile ottenere l'istanza di qualsiasi punto della tua applicazione, ad esempio nel tuo AppDelegato.Quindi aggiungere semplicemente il AFHTTPRequestOperation a questa coda come:

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

Basta gestire il salvataggio nel blocco di completamento, chiamare un methode da questo blocco sul filettatura principale o inviare un NSNotification .

Per chiamare il filettatura principale utilizzare GCD:

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

Altri suggerimenti

Non sono sicuro se questo è utile ma ...

Invece di usare la propria operazione è possibile utilizzare l'operazione di Afhttplient.ENQueue Operazioni singole con enqueuehttpoperazione o Enqueue Una serie di operazioni con enqueueguatchoperations (sto ricordando questi nomi dei metodi dalla memoria, probabilmente da un po 'di distanza).

Per quanto possibile di memorizzare i dati specifici per ciascuna operazione, è possibile sottoclasse AFHTTPRequestorazione e impostare le proprietà per il percorso che desideri memorizzare.Qualcosa come questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top