2011-11-08 11 views
7

Sto lavorando su un problema in cui devo scaricare circa 10 diversi file di grandi dimensioni in una coda, e ho bisogno di visualizzare una barra di avanzamento che indica lo stato del trasferimento totale. Questo funziona perfettamente con ASIHTTPRequest in iOS4, ma sto cercando di passare ad AFNetworking poiché ASIHTTPRequest ha problemi in iOS5 e non viene più mantenuto.Passaggio a AFNetworking da ASIHTTPRequest - Problema con ASINetworkQueue

So che è possibile segnalare lo stato di avanzamento delle singole richieste utilizzando il downloadProgressBlock di AFHTTPRequestOperation, ma non riesco a trovare un modo per segnalare lo stato di avanzamento di più richieste che sarebbero state eseguite sullo stesso NSOperationQueue.

Qualche suggerimento? Grazie!

risposta

0

Proverei la sottoclasse di UIProgressView con una sottoclasse che tiene traccia di tutti i diversi elementi che si stanno guardando e quindi ha una logica che aggiunge il progresso di tutti insieme.

Con il codice come questo, forse:

@implementation customUIProgressView 

-(void) updateItem:(int) itemNum ToPercent:(NSNumber *) percentDoneOnItem { 
    [self.progressQueue itemAtIndexPath:itemNum] = percentDoneOnItem; 

    [self updateProgress]; 
} 
-(void) updateProgress { 
    float tempProgress = 0; 
    for (int i=1; i <= [self.progressQueue count]; i++) { 
    tempProgress += [[self.progressQueue itemAtIndexPath:itemNum] floatValue]; 
    } 
    self.progress = tempProgress/[self.progressQueue count]; 
} 
+0

Questo è un male di codifica pratica per MVC modelli di progettazione. –

+0

Forse. È lo strumento giusto per il lavoro per contenuti di dimensioni dinamiche. Mostrerà accuratamente i progressi senza prima conoscere la dimensione del contenuto. Trovare la dimensione di file di grandi dimensioni (come video o foto) può essere un'operazione costosa. – clreina

0

È possibile creare una sottoclasse AFURLConnectionOperation di avere 2 nuove proprietà: (NSInteger)totalBytesSent e (NSInteger)totalBytesExpectedToSend. È necessario impostare queste proprietà nella callback NSURLConnection in questo modo:

- (void)connection:(NSURLConnection *)__unused connection 
    didSendBodyData:(NSInteger)bytesWritten 
totalBytesWritten:(NSInteger)totalBytesWritten 
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 
{ 
    [super connection: connection didSendBodyData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite]; 
    self.totalBytesSent = totalBytesWritten; 
    self.totalBytesExpectedToSend = totalBytesExpectedToSend; 
} 

tuo blocco uploadprogress può apparire come segue:

……(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { 
    NSInteger queueTotalExpected = 0; 
    NSInteger queueTotalSent  = 0; 
    for (AFURLConnectionOperation *operation in self.operationQueue) { 
     queueTotalExpected += operation.totalBytesExpectedToSend; 
     queueTotalSent  += operation.totalBytesSent; 
    } 
    self.totalProgress = (double)queueTotalSent/(double)queueTotalExpected; 
}]; 
1
[operation setUploadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { 
    NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite); 
}]; 

Il funzionamento è AFHTTPRequestOperation