2013-06-04 4 views
1

Je travaille sur une application iOS qui télécharge des images depuis amazon s3. J'essaie de suivre la progression d'un téléchargement d'image.amazon s3 ios télécharger la barre de progression

Je ne parviens pas à déclencher la méthode de délégation -(void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite.

C'est le code que j'ai jusqu'à présent pour définir la méthode déléguée.

-(void) viewDidLoad 
{ 
self.s3 = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY]; 
self.s3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2]; 

NSString *key = [[NSString alloc] initWithFormat:@"path1/%@", uniqueID]; 

S3GetObjectRequest *downloadRequest = [[S3GetObjectRequest alloc] initWithKey:key withBucket: PICTURE_BUCKET]; 
[downloadRequest setDelegate:self]; 

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
hud.labelText = @"Loading Picture..."; 
S3GetObjectResponse *downloadResponse = [s3 getObject:downloadRequest]; 
} 

-(void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 
{ 
NSLog(@"Bytes Written: %i", bytesWritten); 
NSLog(@"Total Bytes Written: %i", totalBytesWritten); 
NSLog(@"Total Bytes Expected to Write: %i", totalBytesExpectedToWrite); 
} 

j'ai réussi à obtenir cette méthode déléguée à travailler pour le téléchargement des images, mais ne peut pas sembler le faire fonctionner pour le téléchargement. Que dois-je faire différemment pour suivre les progrès du téléchargement?

Merci

+0

J'espère que ce lien vous aidera !! http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transfermanager.html#track-progress – arunjos007

Répondre

3

je suis tombé sur ce tout en me recherches sur AWS et pensé que je posterais une réponse. -(void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite fonctionne uniquement lors de l'envoi de données, selon le nom.

Si vous avez une idée approximative de la taille du fichier (vous pouvez configurer une sorte de demande du serveur pour obtenir cette information avant de commencer le téléchargement, ou s'il y a un montant typique). Ensuite, vous pouvez utiliser -(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data et continuer à ajouter les données à un @property de NSMutableData en appelant [self.data appendData:data], puis mesurez self.data.length qui renvoie le nombre d'octets à votre estimation de taille de métadonnées que vous pourriez convertir en octets.

Espérons que cela aide!

1

AdamG a raison.

-(void)request:(AmazonServiceRequest *)request didSendData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten totalBytesExpectedToWrite:(long long)totalBytesExpectedToWrite est seulement pour le téléchargement.

Lorsque vous voulez garder une trace de la progression d'un téléchargement, vous devez utiliser:

-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data

Et je wan't pour ajouter un peu colaboration de mon propre. Si vous voulez connaître la taille du fichier à télécharger, voici un bon moyen de le faire.

S3GetObjectMetadataRequest *getMetadataObjectRequest = [[S3GetObjectMetadataRequest alloc] initWithKey:YOUR_KEY withBucket:YOUR_BUCKET]; S3GetObjectMetadataResponse *metadataResponse = [[AmazonClientManager s3] getObjectMetadata:getMetadataObjectRequest]; NSString *filesizeHeader = metadataResponse.headers[@"Content-Length"]; fileSize = [filesizeHeader floatValue];

J'ai trouvé le documentation être un peu silencieux à ce sujet.

En outre, les AWS iOS Samples ne contiennent pas non plus un très bon exemple. En fait, il y a un commentaire qui dit que "La barre de progression de Downlaod est juste une estimation.Pour refléter exactement la barre de progression, vous devez d'abord récupérer la taille du fichier", mais sans aucune idée sur la façon de le faire. Donc, j'ai trouvé ça en jouant avec la propriété getMetadataObjectRequest.debugDescription.

Espérons que cela aide!

+0

Nous venons de découvrir que vous pouvez utiliser 'metadataResponse.contentLength' –

Questions connexes