NSURLSession не возвращает данные

Пытаюсь скачать zip-архив с помощью NSURLSessionDataTask. Я знаю, что есть NSURLSessionDownloadTask, но дело в том, что я хочу обратный вызов didReceiveData (чтобы показать прогресс).

Код:

NSURLRequest *request = [NSURLRequest requestWithURL:@"..."
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];

NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSOperationQueue *myQueue = [NSOperationQueue new];
myQueue.underlyingQueue = dispatch_get_main_queue();

NSURLSession *session = [NSURLSession sessionWithConfiguration:config
delegate:self 
delegateQueue:myQueue];

NSURLSessionDataTask* task = [session dataTaskWithRequest:request
completionHandler:^( NSData *data, NSURLResponse *response, NSError *error){ ... }

[task resume];

Мой класс соответствует NSURLSessionDataDelegate.

Когда я вызываю метод, через несколько секунд отладчик переходит к завершениюHandler с данными nil и ошибкой nil. Что я делаю не так?

Я также пробовал:

  • вызов без завершенияHandler, затем отладчик переходит к обратному вызову didReceiveResponse с ответом 200 и все.
  • используя [NSOperationQueue new] для очереди
  • используя [NSURLSession sharedSession] - не получил никакого ответа
  • используя [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier: @"..."] - валится мол что не могу использовать обработчик завершения, а без него - тоже никакого ответа.

person annaoomph    schedule 27.06.2018    source источник
comment
У вас есть два варианта: 1) Использовать делегат и реализовать необходимые методы делегата 2) Использовать обработчик завершения. Варианты не смешиваются. didReceiveData принадлежит делегату. dataTaskWithRequest:completionHandler: принадлежит обработчику завершения   -  person vadian    schedule 27.06.2018
comment
Да, но даже если я использую один из них, он не отправляет мне никаких данных.   -  person annaoomph    schedule 27.06.2018
comment
В принципе, обратный вызов с номером 200 — это хорошо. Вы реализовали другие методы делегата, которые передают данные?   -  person vadian    schedule 27.06.2018
comment
Да, я реализовал это: - (void)URLSession:(NSURLSession *) session dataTask:(NSURLSessionDataTask *) dataTask didReceiveData:(NSData *)data   -  person annaoomph    schedule 27.06.2018
comment
По крайней мере, реализуйте также didFailWithError, чтобы получить возможную ошибку.   -  person vadian    schedule 27.06.2018
comment
я тоже так делал   -  person annaoomph    schedule 27.06.2018
comment
Там написано lost connection to background trasnfer service, так что это уже что-то...   -  person annaoomph    schedule 27.06.2018
comment
Возможно, очередь операций main нарушает (фоновую) функциональность. Попробуйте NSOperationQueue.currentQueue   -  person vadian    schedule 27.06.2018
comment
Пытался. Тем не менее он отправляет мне 200, а затем ничего.   -  person annaoomph    schedule 27.06.2018
comment
Возможно, это полезно: stackoverflow.com/questions /39390388/ ?   -  person koen    schedule 27.06.2018
comment
Спасибо за помощь, ребята! Кажется, я понял, в чем проблема :)   -  person annaoomph    schedule 27.06.2018


Ответы (1)


Итак, я нашел ответ, и он не совсем очевиден из документации: у меня было несколько обратных вызовов, и среди них didReceiveResponse.

Оказывается, я должен вызвать обработчик завершения, чтобы будущие обратные вызовы работали, то есть: completionHandler(NSURLSessionResponseAllow);

И еще: didCompleteWithError на самом деле тот делегат, который сообщает об успешном Finish тоже, хотя название подразумевает, что это обработчик ошибок. Что это значит: когда загрузка успешно завершена, эта функция вызывается с ошибкой = nil.

Надеюсь, это будет полезно для кого-то когда-нибудь.

person annaoomph    schedule 27.06.2018