Я испытываю странную проблему от времени до моего NSURLSessionDownloadTasks (используя конфигурацию загрузки фона).Задача загрузки NSURLSession после ее успешного завершения
Это всегда связано с ошибками с кодом NSURLDomain NSURLErrorBackgroundSessionWasDisconnected (-997). Как правило, сама ошибка возникает из приложения, которое в общем случае сбой или принудительное закрытие во время разработки из Xcode.
Соответствующий код сводится к
- (void)download:(NSURLRequest *)request
{
NSURLSessionDownloadTask *downloadTask = [self.urlSession downloadTaskWithRequest:request];
[downloadTask resume];
}
- (void) URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)tempLocation
{
NSLog(@"task %@ didFinishDownloadingToURL with status code %@", downloadTask, @([downloadTask.response statusCode]));
}
- (void) URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error
{
NSLog(@"task %@ didCompleteWithError %@", task, error);
}
Проблемы в этих случаях, что же NSURLSessionDownloadTask получает два (а не только один ожидаемый) вызова в -[NSURLSessionTaskDelegate URLSession:task:didCompleteWithError:]
. Один раз без ошибки (которая выравнивается с вызовом с кодом ответа 200 OK до -[NSURLSessionDownloadDelegate URLSession:downloadTask:didFinishDownloadingToURL:]
), а затем в другое время, обычно через пару секунд с ошибка (-997). Оба раза это точно такой же адрес памяти для задачи, передаваемой этим методам делегата.
У кого-нибудь еще было что-то похожее? Я не ожидаю этого второго обратного вызова после того, как мне уже сказали, что моя задача преуспела. Есть ли очевидная причина, по которой NSURLSession все еще может справиться с заданием, которое, как сообщается, уже закончилось, но потом вдруг подумает, что он должен сообщить мне, что он потерял связь с ним в фоновом режиме?
является 'свойства identifier' то же, тоже? Я определенно видел, что во время фоновых сеансов приходят несколько вызовов, но они всегда были результатом предыдущих фоновых сеансов из предыдущих, неполных сеансов. (Мы так привыкли начинать с чистого состояния при перезапуске после сбоя, но с фоновыми сеансами старые задачи часто задерживаются.) Но я удивлен, что адрес памяти для задачи действительно идентичен ... – Rob
«Идентификатор» идентичен, и эти обратные вызовы должны основываться на предыдущем, неполном сеансе (из-за сбоя/сбоя, связанного с получением этого поведения). – Dennis