我正在开发一个从亚马逊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 :(得分:3)
我在AWS上研究自己时发现了这一点,并认为我会发布一个答案。 -(void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
仅在按照名称发送数据时有效。
如果您对文件的大小有所了解(您可以设置某种服务器请求以在开始下载之前获取此信息,或者是否存在典型数量)。然后,您可以使用-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data
并继续通过调用@property
将数据附加到NSMutableData
[self.data appendData:data]
,然后测量self.data.length
,返回到的字节数您的元数据大小估计,您可以将其转换为字节。
希望这有帮助!
答案 1 :(得分: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
在这里,我不想添加一些我自己的合作。如果你想知道要下载的文件的大小,这是一个很好的方法。
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
属性找到了这种方式。
希望这有帮助!