Télécharger une grande video via NSURLSession provoque un crash de la pression de la memory

J'utilise les codes suivants pour download la video sur le server, ce qui me request de convertir la video du format video en NSData . Cependant, lorsque la video est volumineuse (par exemple video de 10 minutes), l'application se bloque en raison de la pression de la memory. Comment puis-je résoudre ça?

 - (void)uploadVideo { NSDictionary *params = nil; NSSsortingng *NSURLSessionIdentifier = [NSSsortingng ssortingngWithFormat:@"%@%@",@"my.bundle.identifier.",[self getTimeSsortingng]]; NSURLSessionConfiguration *sessionConfig; // SessionConfiguration With iOS Version if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:NSURLSessionIdentifier]; } else { sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:NSURLSessionIdentifier]; } sessionConfig.HTTPMaximumConnectionsPerHost = 1; NSURLSession *uploadSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue new]]; OMGMultipartFormData *multipartFormData = [OMGMultipartFormData new]; NSSsortingng *url = @"SOME_UPLOAD_URL"; // ========= PROBLEMATIC LINE below ========= self.video_data = [NSData dataWithContentsOfURL:self.video_url]; // ========= PROBLEMATIC LINE above ========= [multipartFormData addFile:self.video_data parameterName:@"file" filename:@"file.mp4" contentType:@"video/mp4"]; NSURLRequest *rq = [OMGHTTPURLRQ POST:url:multipartFormData]; id path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] ssortingngByAppendingPathComponent:@"upload.NSData"]; [rq.HTTPBody writeToFile:path atomically:YES]; [[uploadSession uploadTaskWithRequest:rq fromFile:[NSURL fileURLWithPath:path]] resume]; } 

ps self.video_url est une URL de file donnée par UIImagePickerController qui filter uniquement la video à choisir. Je choisis ensuite une video de 10 minutes.

ps J'ai AFNetworking dans la même application aussi, peut-il aider avec le transfert de fond?

Vous devriez être capable de cela en utilisant un NSMutableURLRequest et en utilisant son setter setHTTPBodyStream .

Ce qui suit sont des extraits adaptés de mon code. Il a bien géré la video pendant plus de 10 minutes. principalement de grandes videos de 60 à 90 minutes.

 NSData *movieData = [NSData dataWithContentsOfFile:theMovieSourceSsortingng]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"video/quicktime" forHTTPHeaderField:@"Content-Type"]; [request setValue:[NSSsortingng ssortingngWithFormat:@"attachment; filename=\"%@\"",yourMovieSourceSsortingng] forHTTPHeaderField:@"Content-Disposition"]; [request setValue:[NSSsortingng ssortingngWithFormat:@"%ld",(unsigned long)[movieData length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBodyStream:[NSInputStream inputStreamWithFileAtPath:yourMovieSourceSsortingng]]; 

Vous pouvez maintenant utiliser cette requête avec votre NSURLConnection

 NSURLConnection *connection =[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Problème est évident – 10 min file video est trop grand pour être stocké dans une memory

 self.video_data = [NSData dataWithContentsOfURL:self.video_url]; 

Est-ce que.

La solution n'est pas de stocker tout le corps de la requête dans une memory. Le moyen le plus simple consiste à utiliser la propriété HTTPBodyStream de NSURLRequest . Vous pouvez créer vous-même NSInputStream, mais puisque vous avez déjà AFNetworking, il est beaucoup plus facile de l'utiliser. Dans mon projet, je le fais de cette façon:

 // data.fields is a dictionary with params NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLSsortingng:[url absoluteSsortingng] parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [data.fields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [formData appendPartWithFormData:[obj dataUsingEncoding:NSUTF8SsortingngEncoding] name:key]; }]; [formData appendPartWithFileURL:fileURL name:@"file_0" error:&error2]; } error:&error];