有没有办法获得随需应变资源下载的预计时间?
我想在全部下载之前显示提醒。
[alertDownload showCustom:self image:[UIImage imageNamed:@"icon.jpg"]
color:[UIColor blueColor]
title:@"Download..."
subTitle:@"Download in progress"
closeButtonTitle:nil
duration: ODR ETA];
现在我有
if (request1.progress.fractionCompleted < 1) {
// code above
}
但下载完成后警报不会自动消失,它会查看警报的持续时间。
答案 0 :(得分:1)
好的,如果您可以获得分数完整值并且您可以测量时间,那么您就知道还剩多久。
开始下载时,请在实例变量中记录开始时间:
@interface MyClass () {
NSTimeInterval _downloadStartTime;
}
- (void)startDownload
{
...
_downloadStartTime = [NSDate timeIntervalSinceReferenceDate];
...
}
然后在您的通知处理程序中,您收到分数完成,请使用:
double fractionComplete = 0.2; // For example
if (fractionComplete > 0.0) { // Avoid divide-by-zero
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSTimeInterval elapsed = now - _downloadStartTime;
double timeLeft = (elapsedTime / fractionComplete) * (1.0 - fractionComplete);
}
注意:我没有解决您显示警告对话框的问题,我认为您使用的逻辑不起作用(您不希望每次获得更新时都显示新警报)。我正在避开整个领域,只专注于ETA逻辑。
答案 1 :(得分:0)
所以,也感谢@trojanfoe的帮助,我实现了这个目标。
基本上,我没有在创建提醒时设置提醒持续时间,但我会根据下载进度对其进行更新。 在下载完成之前,我重复将持续时间设置为20.0f。 然后,当下载完成后,我将持续时间设置为1.0f(因此警报将在1秒内消失)。
NSTimeInterval _alertDuration;
- (void)viewDidLoad {
[request1 conditionallyBeginAccessingResourcesWithCompletionHandler:^
(BOOL resourcesAvailable)
{
if (resourcesAvailable) {
// use it
} else {
[request1 beginAccessingResourcesWithCompletionHandler:^
(NSError * _Nullable error)
{
if (error == nil) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^ {
[alertDownload showCustom:self image:[UIImage
imageNamed:@"icon.jpg"]
color:[UIColor blueColor]
title:@"Download..."
subTitle:@"Download in progress"
closeButtonTitle:nil
duration:_alertDuration];
}
];
} else {
// handle error
}
}];
}
}];
- (void)observeValueForKeyPath:(nullable NSString *)keyPath
ofObject:(nullable id)object
change:(nullable NSDictionary *)change
context:(nullable void *)context {
if((object == request1.progress) && [keyPath
isEqualToString:@"fractionCompleted"]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^ {
if(request1.progress.fractionCompleted == 1) {
_alertDuration = 1.0f;
} else {
_alertDuration = 20.0f;
}
}];
}
}