Progreso de carga de file de seguimiento AFNetworking 2.0

Soy relativamente nuevo en AFNetworking 2.0. Usando el fragment de código a continuación, he podido upload una foto con éxito a mi url. Me gustaría hacer un seguimiento del progreso de carga incremental, pero no puedo encontrar un ejemplo de esto con la versión 2.0. Mi aplicación es iOS 7, así que he optado por AFHTTPSessionManager.

¿Alguien puede ofrecer un ejemplo de cómo modificar este fragment para rastrear el progreso de la carga?

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"myimage.jpg"], 1.0); [manager POST:@"http://myurl.com" parameters:dataToPost constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:imageData name:@"attachment" fileName:@"myimage.jpg" mimeType:@"image/jpeg"]; } success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"Success %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"Failure %@, %@", error, [task.response description]); }]; 

La interfaz de AFHTTPSession no proporciona un método para establecer un bloque de progreso. En cambio, deberás hacer lo siguiente:

 // 1. Create `AFHTTPRequestSerializer` which will create your request. AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer]; // 2. Create an `NSMutableURLRequest`. NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://www.myurl.com" parameters:dataToPost constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:imageData name:@"attachment" fileName:@"myimage.jpg" mimeType:@"image/jpeg"]; }]; // 3. Create and use `AFHTTPRequestOperationManager` to create an `AFHTTPRequestOperation` from the `NSMutableURLRequest` that we just created. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Success %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Failure %@", error.description); }]; // 4. Set the progress block of the operation. [operation setUploadProgressBlock:^(NSUInteger __unused bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { NSLog(@"Wrote %lld/%lld", totalBytesWritten, totalBytesExpectedToWrite); }]; // 5. Begin! [operation start]; 

Además, no tiene que leer la image a través de UIImage y luego comprimirla nuevamente usando JPEG para get un NSData . Simplemente use +[NSData dataWithContentsOfFile:] para leer el file directamente desde su package.

Es cierto que la interfaz de AFHTTPSessionManager no proporciona un método para rastrear el progreso de la carga. Pero el AFURLSessionManager sí.

Como una class henetworkingada de AFURLSessionManager AFHTTPSessionManager puede rastrear el progreso de la carga así:

 NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:kUploadImageURL parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.5) name:@"uploadFile" fileName:@"image" mimeType:@"image/jpeg"]; } error:nil]; NSProgress *progress; NSURLSessionDataTask *uploadTask = [[AFHTTPSessionManager shanetworkingManager] uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (!error) { //handle upload success } else { //handle upload failure } }]; [uploadTask resume]; [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL]; 

fuera de

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) { NSProgress *progress = (NSProgress *)object; //progress.fractionCompleted tells you the percent in CGFloat } } 

Aquí está el método 2 (actualizado)

usar KVO para rastrear el progreso significa que self necesita estar vivo durante la observación. La forma más elegante es el método setTaskDidSendBodyDataBlock , así:

 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager setTaskDidSendBodyDataBlock:^(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) { //during the progress }]; NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:kUploadImageURL parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.5) name:@"uploadFile" fileName:@"image" mimeType:@"image/jpeg"]; } error:nil]; NSURLSessionDataTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (!error) { //handle upload success } else { //handle upload failure } }]; [uploadTask resume];