Descargue una gran cantidad de files en segundo plano en iOS

Tengo una aplicación en la que tengo que download una gran cantidad de files, de 400 a 900 files que tienen un total aproximado de 1 GB.

¿Cuál es el mejor enfoque para lograr esto?

  1. ¿Una NSURLSession y todas las tareas enqueuedas en ella?
  2. Una NSURLSession y NSURLSession por packages (10 por 10, por ejemplo)?
  3. Múltiple NSURLSession con diferentes queues?

De hecho, tengo una NSURLSession dentro de todas las tareas (una por file) en queue, pero a veces obtengo una Lost connection to background transfer service .

Aquí está mi código:

 if([[UIDevice currentDevice] isMultitaskingSupported]) { __block UIBackgroundTaskIdentifier bgTask; UIApplication *application = [UIApplication shanetworkingApplication]; 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; }); } } 

One NSURLSession: porque solo quiere manejar las cosas basadas en la session solo una vez (auth, por ejemplo).

One NSOperationQueue: con múltiples operaciones ejecutándose al mismo time. (Ver propiedad operationCount). Puede ser un poco complicado implementar un NSOperation por primera vez, pero estoy seguro de que esta sería su mejor apuesta. https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/index.html

http://nshipster.com/nsoperation/

Ah, y por cierto, este es un enfoque altamente orientado a objects, que siempre es bueno =)