还押资源 - 预计时间(以及如何根据下载进度显示警报)

Posted

技术标签:

【中文标题】还押资源 - 预计时间(以及如何根据下载进度显示警报)【英文标题】:On Remand Resources - Estimated Time (and how to show an alert depending on the download progress) 【发布时间】:2016-03-23 19:48:24 【问题描述】:

有没有办法获得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

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

【问题讨论】:

您使用什么 API 进行下载?它是否使用 HTTP,如果是,那么响应中是否提供了 contentLength 嘿,我正在使用按需资源developer.apple.com/library/ios/documentation/FileManagement/… OK 以便该页面显示使用通知来跟踪下载进度的代码。你试过了吗? 是的,我可以访问进度(它是 o 和 1 之间的浮点数),但我认为没有办法获得估计的下载时间 酷;你应该能够从中解决。例如,如果 10 秒后为 0.2,则表示估计还剩 40 秒。 float timeLeft = (elapsedTime / fractionComplete) * (1.0 - fractionComplete);. 【参考方案1】:

好的,如果你能得到 fraction complete 值并且你可以测量时间,那么你就知道你还剩下多长时间了。

开始下载时,在实例变量中记录开始时间:

@interface MyClass () 
    NSTimeInterval _downloadStartTime;


- (void)startDownload

    ...
    _downloadStartTime = [NSDate timeIntervalSinceReferenceDate];
    ...

然后在您收到 fraction complete 的通知处理程序中,使用:

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 逻辑。

【讨论】:

@fabersky 注意:我原来的elapsed 计算中有一个错误。 ok ;) 但有一个问题:我必须在下载开始时显示警报并设置其持续时间,那么我如何知道下载开始前的剩余时间? @fabersky 我不知道 TBH。如果有某种方法可以更新已显示的警报视图中的文本,那么这就是要走的路。否则,请完全避免使用警报视图并使用您可以完全控制的其他视图技术。 好吧,我可以用这个!还有一件事:例如,您不认为每 0.2 的 fractionComplete 更新一次 timeLeft 会更好吗?进行更精确的估计 感谢@***foe。你觉得这个答案怎么样?【参考方案2】:

所以,也感谢@***foe的帮助,我做到了。

基本上,我在创建警报时没有设置警报持续时间,但我会根据下载进度对其进行更新。 在下载完成之前,我反复将持续时间设置为 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;
     
    ];
 

【讨论】:

以上是关于还押资源 - 预计时间(以及如何根据下载进度显示警报)的主要内容,如果未能解决你的问题,请参考以下文章

关于VB.NET中进度条使用问题

如何创建 Azure 警报以通知任何资源删除

golang进度条

根据服务器进程完成显示进度条加载器

如何根据另一个文件的下载进度淡入 UIImage

Retrofit2文件上传下载及其进度显示