1

我正在开发一个从 amazon 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);
}

我设法让这个委托方法用于上传图像,但似乎无法让它用于下载。我需要做些什么来跟踪下载进度?

谢谢

4

2 回答 2

3

我在 AWS 上研究自己时遇到了这个问题,并认为我会发布一个答案。 -(void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 根据名称,仅在发送数据时有效。

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

希望这可以帮助!

于 2013-09-18T22:41:51.300 回答
1

亚当格是对的。

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

当您想跟踪下载进度时,您应该使用:

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

在这里我不想添加一些我自己的合作。如果您想知道要下载的文件的大小,这是一个很好的方法。

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

我发现文档对此有点沉默。

此外,AWS iOS 示例也没有包含很好的示例。实际上,有一条评论说“下载进度条只是一个估计值。为了准确反映进度条,您需要先检索文件大小”,但不知道如何做到这一点。

因此,我通过弄乱该getMetadataObjectRequest.debugDescription物业找到了这种方式。

希望这可以帮助!

于 2014-04-12T13:36:19.380 回答