Fallos AFNetworking, descarga de files grandes 200MB +

No tengo problemas para download files de less de 250 MB, pero cuando bash download 250 MB + cremalleras, la aplicación simplemente falla inesperadamente sin errores. A veces pasa, a veces no. Las fugas no confirman hinchazón o pérdida de memory.

También noté ahora que el locking solo ocurre cuando estoy depurando con xcode. Cuando ejecuto la aplicación y descargo los files más grandes cuando no estoy depurando no hay problemas

¿Debo abordar las classs de AFNetworking de manera diferente al download un file más grande?

aquí está mi código

NSURL* url=[BFAppGlobals getServerURL:[M.Properties objectForKey:@"zip_path" ]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setTimeoutInterval:3600]; AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; NSString* writePath=[BFAppGlobals getContentResourcePathForFile:strFile]; [delegate onStartDownload:M]; operation.outputStream = [NSOutputStream outputStreamToFileAtPath:writePath append:YES]; [operation setDownloadProgressBlock:^(NSInteger bytesRead, NSInteger totalBytesRead, NSInteger totalBytesExpectedToRead) { int b=totalBytesRead ; int total=totalBytesExpectedToRead; float perc=(float)b/(float)total; M.progress=perc; [((NSObject*)delegate) performSelectorOnMainThread:@selector(onDataReceviedFromRequest:) withObject:M waitUntilDone:YES]; }]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSDictionary* params=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:writePath,writeDirectory, M, nil] forKeys:[NSArray arrayWithObjects:@"Path",@"Dir",@"Model", nil]]; [self performSelectorInBackground:@selector(unzipDownloaded:) withObject:params]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"fail! %@", [error localizedDescription]); [delegate onErrorDownload:M WithError:[error localizedDescription]]; ActiveModel=nil; }]; [operation start]; **************************** UPDATE ADDED CRASH LOG *************************************** Thread 0 Crashed: 0 libobjc.A.dylib 0x37d24fbc objc_msgSend + 16 1 Foundation 0x35502508 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 12 2 CoreFoundation 0x381aa570 ___CFXNotificationPost_block_invoke_0 + 64 3 CoreFoundation 0x381360c8 _CFXNotificationPost + 1400 4 Foundation 0x354763f4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 60 5 Foundation 0x35477c24 -[NSNotificationCenter postNotificationName:object:] + 24 6 BFiPad 0x0006d2fc 0x1000 + 443132 7 CoreFoundation 0x3813d224 -[NSObject performSelector:withObject:] + 36 8 Foundation 0x35517750 __NSThreadPerformPerform + 344 9 CoreFoundation 0x381b2afc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 8 10 CoreFoundation 0x381b22c8 __CFRunLoopDoSources0 + 208 11 CoreFoundation 0x381b106e __CFRunLoopRun + 646 12 CoreFoundation 0x381344d6 CFRunLoopRunSpecific + 294 13 CoreFoundation 0x3813439e CFRunLoopRunInMode + 98 14 GraphicsServices 0x37f0bfc6 GSEventRunModal + 150 15 UIKit 0x31cb473c UIApplicationMain + 1084 16 BFiPad 0x00003f72 0x1000 + 12146 17 BFiPad 0x00003f30 0x1000 + 12080 

Parece que esto solo sucede en el modo de debugging. Quedarse sin el modo de debugging o en la versión más resuelve este problema

No parece que la operation sea ​​propiedad de nada en particular, por lo que no hay garantía de que se quede en la memory. Intente utilizar un NSOperationQueue (quizás uno adjunto a un AFHTTPClient , que limpiaría gran parte de ese código), o configurarlo como una propiedad retenida en el controller que inicia la carga.

Sé que esta pregunta es antigua, pero el problema sigue siendo relevante, por lo que publicaré mi solución de todos modos.

He tenido el mismo problema en el que se bloquearía después de download alnetworkingedor de 250 MB y descubrí que fue causado por el hecho de que el bloque de progreso de descarga se llamaba cada vez que se descargaban algunos bytes, lo que significa que se llama MUCHO. Muchas veces cada segundo. Entonces, cuando el método de delegado (que presumiblemente hace algunas cosas) se llama desde aquí, puede llegar a ser bastante intensivo en memory.

Mi solución fue rastrear el progreso de la descarga y solo llamar al método de delegado si el cambio es significativo (decidí más del 1%):

 [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { float progress = ((float)totalBytesRead) / totalBytesExpectedToRead; if ((progress - totalProgress) > 0.01) { totalProgress = progress; [delegate updateProgress:progress]; } }]; 

float totalProgress es una variable de instancia.

Esta solución networkingujo el uso de memory de alnetworkingedor de 280 MB en el punto del crash a alnetworkingedor de 30 MB, que ya estaba usando mi aplicación. Es decir, no hubo un aumento notable de la memory durante el process de descarga (suponiendo que está descargando directamente a un file, no a la memory).