According to the documentation for NSProgress
I see that -[NSProgress localizedAdditionalDescription]
can report download speed and time remaining, e.g.:
1.61 GB of 3.22 GB (2 KB/sec) — 2 minutes remaining
However, I'm not able to get those details when I associate an NSProgress
to a NSURLSessionDownloadTask
. Here's my code:
Downloader.h
@interface Downloader : NSObject
@property NSProgress *overallProgress;
-(void)startDownload;
@end
Downloader.m
- (void)startDownload {
self.overallProgress = [NSProgress progressWithTotalUnitCount:100];
[self.overallProgress setKind:NSProgressKindFile];
[self.overallProgress setUserInfoObject:NSProgressFileOperationKindKey forKey:NSProgressFileOperationKindDownloading];
[self.overallProgress becomeCurrentWithPendingUnitCount:100];
[self work1];
[self.overallProgress resignCurrent];
}
- (void)work1 {
NSProgress *firstTaskProgress = [NSProgress progressWithTotalUnitCount:1];
[firstTaskProgress setKind:NSProgressKindFile];
[firstTaskProgress setUserInfoObject:NSProgressFileOperationKindKey forKey:NSProgressFileOperationKindDownloading];
NSURL *downloadURL = [NSURL URLWithString:@"http://ipv4.download.thinkbroadband.com/200MB.zip"];
NSURL *destinationDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSURL *destinationURL = [destinationDirectory URLByAppendingPathComponent:[downloadURL lastPathComponent]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDownloadTask *fileDownloadTask =
[session downloadTaskWithURL:downloadURL
completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error){
[[NSFileManager defaultManager] removeItemAtURL:destinationURL error:NULL];
[[NSFileManager defaultManager] moveItemAtURL:location toURL:destinationURL error:nil];
[firstTaskProgress setCompletedUnitCount:1];
}];
[fileDownloadTask resume];
}
DownloadObserver.m
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
downloader = [Downloader new];
[downloader addObserver:self
forKeyPath:@"overallProgress.fractionCompleted"
options:NSKeyValueObservingOptionNew
context:NULL];
[downloader startDownload];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@", [downloader.overallProgress localizedAdditionalDescription]);
}
This only prints out:
0 of 100
Zero KB of 100 bytes
How can I get localizedAdditionalDescription
to print the download speed and time remaining?
NSProgress
to do those calculations for you. – Cruzcruzado