在还原资源上 - 估计时间(以及如何根据下载进度显示警报)

时间:2016-03-23 19:48:24

标签: ios objective-c uialertview duration on-demand-resources

有没有办法获得随需应变资源下载的预计时间?

我想在全部下载之前显示提醒。

[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
}

但下载完成后警报不会自动消失,它会查看警报的持续时间

2 个答案:

答案 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;
     }
    }];
 }
}