NSURLSessionDownloadTask завершается без файла по адресу URL
Я запускаю кучу загрузок, используя NSURLSessionDownload
задачи и NSURLSession
с фоновой конфигурацией. В большинстве случаев все работает нормально, но иногда нет временного файла на location
указано в delegate
метод обратного вызова. Это происходит как на симуляторе, так и на устройстве. Вот код, но все выглядит довольно просто, так же, как у них есть пример SimpleBackgroundTransfer.
....
for (NSUInteger i = 0; i < 10; i++) {
NSString *downloadURLString = ...;
NSURLSessionDownloadTask *task = [[self backgroundURLSession] downloadTaskWithURL:[NSURL URLWithString:downloadURLString]];
[task resume];
}
....
- (NSURLSession *)backgroundURLSession
{
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *identifier = @"com.yyy.backgroundTransfer";
NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
session = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
});
return session;
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
NSLog(@"%s", __PRETTY_FUNCTION__);
NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[location path]], nil);
/// This assert gets triggered every now and then. Any idea why?
/// And downloadTask.originalRequest in fact has a valid download URL and the status code for the response in downloadTask it is 200
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
Кроме того, странно то, что когда эта странная вещь не происходит NSURLSessionDelegate
методы вызываются, просто URLSession:downloadTask:downloadTask:location
без файла по адресу URL (и downloadTask.originalRequest
на самом деле имеет действительный URL-адрес для загрузки и код состояния для ответа в downloadTask это 200).
Если происходит эта странная вещь, это происходит для всех запланированных загрузок, точно так же, как система вообще не может создавать файлы. URLSession:downloadTask:downloadTask:location
называется сразу.
Перезапуск устройства / симулятора, кажется, всегда помогает. Перезапуск приложения никогда не помогает.
Кто-нибудь испытывал что-то подобное?