2

У меня есть реализация ниже NSURLSession.NSURLSession делегат didCompleteWithError не называется

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
self.session = [NSURLSession sessionWithConfiguration:configuration 
                   delegate:self 
                   delegateQueue: nil]; 

NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request]; 
[task resume];   
while(!finished) { 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]]; 
} 

и я реализовывали ниже делегата methds:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)aresponse 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didCompleteWithError:(NSError *)error 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
    completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, 
         NSURLCredential *credential))completionHandler 

«закончил» переменная во время цикла выше устанавливается в 1, когда didCompleteWithError делегат получил, когда указывает на то, что есть какой-то вопрос, как сети вниз, и т. д.

Когда сеть отключена, я не получаю didCompleteWithErrorcallback, поэтому цикл while не выйдет, хотя был указан тайм-аут 10sec, и мое приложение вылетает, давая Предупреждение памяти.

Я правильно принимаю didReceiveData, didReceiveResponse callback во всех сценариях. Не проверял callReceiveChallenge, хотя для этого требуется настройка HTTP.

так, я на следующие вопросы, чтобы спросить, если вы можете мне помочь:

1) Почему didCompleteWithError обратный вызов не получен, когда сеть вниз?

2) Если нет проблем с сетью, возникает didCompleteWithError ответ на успешное завершение задания? Если нет, какой обратный вызов указывает на завершение задачи, например connectionDidFinishLoading при использовании NSURLConnection?

Я использовал кэширование в параметре запроса при запуске задачи. Это из-за этого, что didcompletwitherror не называется n, а кэширование делегата должно быть реализовано ??

Ребята, пожалуйста, помогите. Я застрял.

Thankyou

+2

Не прикасайтесь к циклу запуска, если проект не является интерфейсом командной строки без неявного цикла запуска – vadian

+0

. Что относительно других методов делегата? они называются, когда нет пробоя в сети? –

+0

ОК. Японял твою точку зрения . Но почему мой метод делегата не вызван? не могли бы вы предложить что-нибудь? – CodeTry

ответ

0

delegateQueue: [NSOperationQueue mainQueue] вместо вместо delegateQueue: ноль сделал трюк. Я все еще не знаю, как это сделать. Но да, проблема ушла. Кто-нибудь может объяснить, как это работает?

+0

У меня все еще проблема, хотя я установил делегатQueue: NSOperationQueue.mainQueue, мои обратные вызовы делегатов по-прежнему не вызываются. – mixtly87

0

Ваша петля «пока (! Закончена)» - это действительно плохая практика. В основном задача загрузки - это операция async, но с вашим while-loop вы блокируете поток и принудительно завершаете задачу загрузки в этом потоке. Это может повлиять на поведение системы.

Я верю, что удаление этого цикла решит вашу проблему.

Смежные вопросы