Ho un'app in cui devo scaricare un numero elevato di file, da 400 a 900 file che sono circa 1 GB in totale.Scarica un numero elevato di file in background in iOS
Qual è l'approccio migliore per raggiungere questo obiettivo?
- Uno
NSURLSession
e tutti i task sono stati inseriti in esso? - Uno
NSURLSession
e accodare attività per pacchetti (10 per 10 ad esempio)? - Più
NSURLSession
con diverse code?
In realtà ho un NSURLSession
all'interno di tutti i task (uno per ogni file) accodato, ma a volte ottengo un Lost connection to background transfer service
.
Ecco il mio codice:
if([[UIDevice currentDevice] isMultitaskingSupported])
{
__block UIBackgroundTaskIdentifier bgTask;
UIApplication *application = [UIApplication sharedApplication];
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *uuidString;
CFUUIDRef uuid = CFUUIDCreate(nil);
uuidString = CFBridgingRelease(CFUUIDCreateString(nil, uuid));
CFRelease(uuid);
// }
NSURLSessionConfiguration *sessionConfiguration;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.fiveflamesmobile.bakgroundDownload"];
}
else
{
sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.fiveflamesmobile.bakgroundDownload"];
}
sessionConfiguration.HTTPMaximumConnectionsPerHost = 5;
sessionConfiguration.sessionSendsLaunchEvents = YES;
sessionConfiguration.discretionary = YES;
sessionConfiguration.timeoutIntervalForResource = 0; //NO timeout
sessionConfiguration.timeoutIntervalForRequest = 0; //No timeout
sessionConfiguration.networkServiceType = NSURLNetworkServiceTypeBackground;
self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration
delegate:self
delegateQueue:nil];
NSLog(@"##### ------- Sesion created succesfully");
// [self batchDownloading];
for (id<FFDownloadFileProtocol> file in self.selectedCatalogProducto.downloadInfo.arrayFiles)
{
[self startDownloadFile:file];
}
NSLog(@"##### ------- Download tasks created successfully ------");
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
}
'Un NSURLSession e compiti di accodamento da pacchetti (10 per 10, per esempio)? 'suona bene. –
@AnoopVaidya perché lo dici? Dovrebbe solo creare una singola sessione in background e aggiungere le sue attività di download. Non vedo alcun valore nell'approccio 10x10. – Rob
sei riuscito a scaricare tutti i file in background? – Mahesh