2010-03-16 12 views

risposta

14

Non è possibile mettere in pausa, per sé, ma è possibile annullare una connessione e quindi crearne una nuova per riprendere la posizione in cui il vecchio era stato interrotto. Tuttavia, il server a cui ti stai collegando deve supportare l'intestazione Range. Impostalo su "bytes = size_already_downloaded-", e dovrebbe riprendere esattamente dove l'hai annullato.

+0

ottima risposta –

2

Per riprendere il download e ottenere il resto del file è possibile impostare il valore Range nella richiesta HTTP colpo di testa di fare qualcosa di simile:

- (void)downloadFromUrl:(NSURL*)url toFilePath:(NSString *)filePath { 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url  cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 
    if (!request) { 
     NSLog(@"Error creating request"); 
     // Do something 
    } 
    [request setHTTPMethod:@"GET"]; 

    // Add header to existing file 
    NSFileManager *fm = [NSFileManager defaultManager]; 
    if([fm fileExistsAtPath:filePath]) { 
     NSError *error = nil;  
     NSDictionary * fileProp = [fm attributesOfItemAtPath:filePath error:&error]; 
     if (error) { 
      NSLog(@"Error: %@", [error localizedDescription]); 
      // Do something 
     } else { 
      // Set header to resume 
      long long fileSize = [[fileProp objectForKey:@"NSFileSize"]longLongValue]; 
      NSString *range = @"bytes="; 
      range = [[range stringByAppendingString:[[NSNumber numberWithLongLong:fileSize] stringValue]] stringByAppendingString:@"-"]; 
      [request setValue:range forHTTPHeaderField:@"Range"]; 
     } 
    } 
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (!connection) { 
     NSLog(@"Connection failed."); 
     // Do something 
    } 
} 

Inoltre è possibile utilizzare - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response per verificare se il file esistente è completamente scaricato controllando la dimensione prevista: [response expectedContentLength];. Se le dimensioni corrispondono probabilmente si desidera annullare la connessione.

+0

Finaly ha trovato una soluzione funzionante. Molte grazie :-) – byJeevan