2015-01-07 10 views
20

In un'applicazione iOS 8.1, sto utilizzando NSURLSessionDownloadTask per scaricare un archivio in background che a volte può diventare piuttosto grande.Cosa succede se lo spazio su disco si esaurisce durante l'uso di NSURLSessionDownloadTask in background?

Tutto funziona correttamente, ma cosa succederà se il telefono esaurisce lo spazio su disco? Il download fallirà e indicherà che si trattava di un problema di spazio su disco rimanente? C'è qualche buon modo per controllare in anticipo?

+1

Prima di iniziare il download, ottenere le dimensioni del file e controllare lo spazio libero nel dispositivo. In modo che tu possa informare l'utente se non c'è abbastanza spazio libero. – Mrunal

+1

Ecco un modo per controllare lo spazio disponibile: http://stackoverflow.com/questions/5712527/how-to-detect-total-available-free-disk-space-on-the-iphone-ipad-device – Mrunal

+0

@Mrunal Questo non risolve completamente il problema. Cosa succede se c'è un'altra app che scarica un file di grandi dimensioni in background? – HAS

risposta

9

è possibile ottenere lo spazio disponibile su disco per un dispositivo come questo utenti:

- (NSNumber *)getAvailableDiskSpace 
{ 
    NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/var" error:nil]; 
    return [attributes objectForKey:NSFileSystemFreeSize]; 
} 

sarà probabilmente necessario per avviare il download per ottenere la dimensione del file che si sta scaricando. Esiste un metodo delegate conveniente per NSURLSession che fornisce i byte attesi quando riprende l'attività:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes 
{ 
    // Check if we have enough disk space to store the file 
    NSNumber *availableDiskSpace = [self getAvailableDiskSpace]; 
    if (availableDiskSpace.longLongValue < expectedTotalBytes) 
    { 
     // If not, cancel the task 
     [downloadTask cancel]; 

     // Alert the user 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Low Disk Space" message:@"You don't have enough space on your device to download this file. Please clear up some space and try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alertView show]; 
    } 
}