2015-03-04 2 views
0

Я испытываю странную проблему от времени до моего 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 все еще может справиться с заданием, которое, как сообщается, уже закончилось, но потом вдруг подумает, что он должен сообщить мне, что он потерял связь с ним в фоновом режиме?

+0

является 'свойства identifier' то же, тоже? Я определенно видел, что во время фоновых сеансов приходят несколько вызовов, но они всегда были результатом предыдущих фоновых сеансов из предыдущих, неполных сеансов. (Мы так привыкли начинать с чистого состояния при перезапуске после сбоя, но с фоновыми сеансами старые задачи часто задерживаются.) Но я удивлен, что адрес памяти для задачи действительно идентичен ... – Rob

+0

«Идентификатор» идентичен, и эти обратные вызовы должны основываться на предыдущем, неполном сеансе (из-за сбоя/сбоя, связанного с получением этого поведения). – Dennis

ответ

0

FWIW У меня была аналогичная проблема, поскольку я обновлял пользовательский интерфейс из методов делегатов NSURLSession, которые выполняются в фоновом потоке.

Таким образом, решение для меня было, чтобы переместить UI связанный код для запуска в главном потоке, как показано ниже:

dispatch_async(dispatch_get_main_queue(), ^{ 
     //code updating the UI. 
}); 
Смежные вопросы