Così sto creando il mio download sul thread principaleDiscussioni NSURLSession: Monitoraggio download multipli sfondo
NSURLRequest *request = [NSURLRequest requestWithURL:download.URL];
NSURLSessionDownloadTask *downloadTask = [self.downloadSession downloadTaskWithRequest:request];
[downloadTask resume];
e aggiungendo la NSManagedContextID associato con il download a un NSMutableDictionary, così posso recuperare in un secondo momento nel delegato call-back
[self.downloads setObject:[download objectID] forKey:[NSNumber numberWithInteger:downloadTask.taskIdentifier]];
mio self.downloadSession
sopra è configurato in questo modo
- (NSURLSession *)backgroundSession
{
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.test.backgroundSession"];
configuration.discretionary = YES;
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return session;
}
Il mio problema è i callback delegato sembrano essere invitato diversi thread
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSManagedObjectID *downloadID = [self.downloads objectForKey:[NSNumber numberWithInteger:downloadTask.taskIdentifier]];
double progress = (double)totalBytesWritten/(double)totalBytesExpectedToWrite;
NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:downloadID,@"download",[NSNumber numberWithDouble:progress],@"progress", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadProgress" object:nil userInfo:userInfo];
}
Così, quando accedo self.downloads per ottenere l'objectID corretto, in realtà sto accesso alla NSMutableDictionary da un thread diverso da quello è stato creato su, e credo che NSMutableDictionary non sia sicuro. Allora, qual è la soluzione migliore per questo, ho potuto usato qualcosa di simile
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
quando si dichiara la sessione, impostare la coda delegato al mainQueue che causa tutti i delegati per essere chiamato sul thread principale, ma vorrei come mantenere tutti i callback su un thread in background, se possibile
Hai provato a impostare il tuo thread durante la definizione della sessione? – Mundi
@Mundi Per quanto riguarda la gestione con 'NSMutableArray' e il modello di' NSObject' come spiegato in [questo tutorial?] (Http://www.appcoda.com/background-transfer-service-ios7/) – Praveenkumar