Ранее в iOS7, когда мы пытались загрузить запрос потока в фоновом режиме, мы получали следующее исключение
Приложение завершает работу из-за необработанного исключения "NSGenericException", причина: "Загрузки задач в фоновых сеансах должны быть из файла"
Но в iOS8 нет исключений, когда мы пытаемся загрузить поток в фоновом режиме.
Теперь мой вопрос
1) Разрешена ли загрузка backgourd с помощью uploadTaskWithStreamedRequest: в iOS8?
2) В iOS8 я использую фоновую NSURLConfiguration с uploadTaskWithStreamedRequest. Я использую -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *))completionHandler для предоставления потока в NSUrlSession. Когда приложение находится на переднем плане, оно работает нормально и загружает мой файл на сервер. Но как только приложение переходит в фоновый режим, поток заканчивается, и NSURLSession завершается со следующей ошибкой
Error Domain=NSURLErrorDomain Code=-997 "Потеряно соединение со службой фоновой передачи"
Я думаю, что когда приложение переходит в фоновый режим, мой поток заканчивается. Теперь мой вопрос заключается в том, в каком цикле выполнения я должен запланировать свой поток или сообщить мне, есть ли какая-либо ошибка в моем понимании.
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *))completionHandler
{
// Open producer/consumer streams. We open the producerStream straight
// away. We leave the consumerStream alone; NSURLConnection will deal
// with it.
NSLog(@"%@", [NSThread currentThread]);
NSInputStream *consStream;
NSOutputStream *prodStream;
[NSStream createBoundInputStream:&consStream outputStream:&prodStream bufferSize:SFAMaxBufferLength];
assert(consStream != nil);
assert(prodStream != nil);
self.consumerStream = consStream;
self.producerStream = prodStream;
self.producerStream.delegate = self;
[self.producerStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[self.producerStream open];
// Set up our state to send the body prefix first.
self.buffer = [self.bodyPrefixData bytes];
self.bufferLimit = [self.bodyPrefixData length];
completionHandler(self.consumerStream);
}