Więc tworzę moje pobrania w głównym wątkuNSURLSession wątki: Śledzenie wielu pobieranie tła
NSURLRequest *request = [NSURLRequest requestWithURL:download.URL];
NSURLSessionDownloadTask *downloadTask = [self.downloadSession downloadTaskWithRequest:request];
[downloadTask resume];
i dodanie NSManagedContextID związanego z pobraniem do NSMutableDictionary, więc mogę je odzyskać później w delegata Call-beki
[self.downloads setObject:[download objectID] forKey:[NSNumber numberWithInteger:downloadTask.taskIdentifier]];
My self.downloadSession
powyżej jest skonfigurowany jak to
- (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;
}
Mój problem jest callbacks delegat wydaje się być wywołana na różnych wątkach
- (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];
}
Więc kiedy dostęp self.downloads aby uzyskać prawidłowy objectID, ja faktycznie dostęp do NSMutableDictionary z innego wątku niż jeden został stworzony na i wierzę, że NSMutableDictionary nie jest bezpieczny dla wątków. Więc, co jest najlepszym rozwiązaniem dla tego, mogę stosować coś takiego
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
podczas deklarowania sesję ustawić kolejkę przekazać mainQueue co powoduje wszystkie delegatów na miano w głównym wątku, ale chciałbym jak zachować wszystkie wywołania zwrotne w wątku tła, jeśli to możliwe
Czy próbowałeś po prostu ustawić własny wątek podczas definiowania sesji? – Mundi
@Mundi A co z obsługą z 'NSMutableArray' i' modelem NSObject' jak wyjaśniono w [ten samouczek?] (Http://www.appcoda.com/background-transfer-service-ios7/) – Praveenkumar