2013-06-04 154 views
1

我正在从亚马逊s3下载图像的iOS应用程序。我试图跟踪图片下载的进度。亚马逊s3 ios下载进度条

我不能让-(void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite委托方法触发。

这是我至今设置委托方法的代码。

-(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); 
} 

我设法让这个委托方法工作上传图像,但似乎无法让它下载工作。为了追踪下载进度,我需要做什么不同的事情?

感谢

+0

希望这个链接将帮助你! http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transfermanager.html#track-progress – arunjos007

回答

3

我碰到这个而来到AWS研究自己,我想我会发布一个答案。 -(void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 仅在按名称发送数据时有效。

如果您对文件的大小有一个大概的了解(您可以设置某种服务器请求以在开始下载之前获取此信息,或者有一个典型数量)。然后,您可以使用-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data,然后通过调用[self.data appendData:data]继续将数据附加到的,然后测量self.data.length,它将字节数返回到您可以转换为字节的元数据大小估计值。

希望这会有所帮助!

1

AdamG是对的。

-(void)request:(AmazonServiceRequest *)request didSendData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten totalBytesExpectedToWrite:(long long)totalBytesExpectedToWrite仅用于上传。

当你要跟踪的下载进度,你应该使用:

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

在这里,我wan't添加一些我自己的colaboration。如果你想知道下载文件的大小,这是一个很好的方法。

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];

我发现documentation是有点无语这一点。

此外,AWS iOS Samples也不包含一个很好的例子。实际上,有一条评论指出:“下载进度条只是一个估计值,为了准确地反映进度条,你需要首先检索文件大小”,但不知道如何去做。

所以,我发现这种方式通过搞乱getMetadataObjectRequest.debugDescription财产。

希望这会有所帮助!

+0

刚发现可以使用'metadataResponse.contentLength' –