还押资源 - 预计时间(以及如何根据下载进度显示警报)
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;
];
【讨论】:
以上是关于还押资源 - 预计时间(以及如何根据下载进度显示警报)的主要内容,如果未能解决你的问题,请参考以下文章