在iphone中下载图像时,在UIProgressView中显示准确的进度

在iphone中下载图像时,在UIProgressView中显示准确的进度,第1张

概述我有四个包含图像的网址… 我正在将这些图像下载并将它们放入文档文件夹中. 这是我的代码.. -(void)viewDidLoad{NSMutableArray *myUrlsArray=[[NSMutableArray alloc]init];[myUrlsArray addObject:@"http://blogs.sfweekly.com/thesnitch/steve_jobs3.jp 我有四个包含图像的网址…
我正在将这些图像下载并将它们放入文档文件夹中.

这是我的代码..

-(voID)vIEwDIDLoad{NSMutableArray *myUrlsArray=[[NSMutableArray alloc]init];[myUrlsArray addobject:@"http://blogs.sfweekly.com/thesnitch/steve_jobs3.jpg"];[myUrlsArray addobject:@"http://www.droID-life.com/wp-content/uploads/2012/12/Steve-Jobs-Apple.jpg"];[myUrlsArray addobject:@"http://2.bp.blogspot.com/-T6nbl0rQoME/To0X5FccuCI/AAAAAAAAEZQ/ipUU7JfEzTs/s1600/steve-jobs-in-time-magazine-front-cover.png"];[myUrlsArray addobject:@"http://images.businessweek.com/ss/08/09/0929_most_influential/image/steve_jobs.jpg"];[myUrlsArray addobject:@"http://cdn.ndtv.com/tech/gadget/image/steve-jobs-face.jpg"];for (int i=0; i<myUrlsArray.count; i++){    [self downloadImageFromURL:[myUrlsArray objectAtIndex:i] withname:[Nsstring stringWithFormat:@"MyImage%i.jpeg",i]];}}#pragma mark- downloading file-(voID)downloadImageFromURL:(Nsstring *)myURLString withname:(Nsstring *)filename{UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:myURLString]]];NSLog(@"%f,%f",image.size.wIDth,image.size.height);   // Let's save the file into document folder.**    Nsstring *documentsPath = [NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];Nsstring *jpegPath = [Nsstring stringWithFormat:@"%@/%@",documentsPath,filename];// this path if you want save reference path in sqliteNSData *data2 = [NSData dataWithData:UIImageJPEGRepresentation(image,1.0f)];//1.0f = 100% quality[data2 writetofile:jpegPath atomically:YES];}

现在……我需要准确显示UIProgressVIEw以便上面的下载进度.

我怎样才能实现这个功能……

任何人都可以提供一些指导来实现这一目标.

提前致谢…

解决方法 我建议您使用一些异步下载技术(AFNetworking,SDWebImage,或使用基于委托的NSURLSession自行编写)而不是dataWithContentsOfURL,以便(a)不阻塞主队列; (b)随着下载的进行,您可以获得进度更新.

我还建议为每次下载创建一个NSProgress.当您的委托方法获取有关已下载的字节数的更新时,请更新nsprogress对象.

然后,您可以将每个nsprogress与UIProgressViewobservedProgress相关联,当您更新nsprogress时,可以自动更新UI.

或者,如果您和单个UIProgressVIEw显示每个下载的所有nsprogress的聚合进度,您可以创建父nsprogress,将每个下载的nsprogress建立为父nsprogress的子级,然后,当每个下载更新其各自nsprogress,这将自动触发父nsprogress的计算.再次,您可以将该父nsprogress绑定到主UIProgressVIEw,并且您将自动更新具有总进度的UI,只需让每个下载更新其单独的nsprogress.

但是,有一个技巧,因为有些Web服务不会通知您预期的字节数.他们将报告NSURLResponseUnkNownLength的“预期字节数”,即-1! (有合理的理由说明为什么它可能超出了这个问题的范围.)这显然很难计算下载的百分比.

在这种情况下,有几种方法:

>你可以举起手来,只使用一个不确定的进度指示器;
>您可以尝试更改请求,以便Web服务将报告有意义的“预期字节数”值(例如https://stackoverflow.com/a/22352294/1271826);要么
>您可以使用“估计下载大小”来估算完成百分比.例如,如果您知道您的图像平均每个100kb,您可以执行以下 *** 作来更新与特定下载相关联的nsprogress:

if (totalBytesExpectedToWrite >= totalBytesWritten) {    self.progress.totalUnitCount = totalBytesExpectedToWrite;} else {    if (totalBytesWritten <= 0) {        self.progress.totalUnitCount = kDefaultimageSize;    } else {        double written = (double)totalBytesWritten;        double percent = tanh(written / (double)kDefaultimageSize);        self.progress.totalUnitCount = written / percent;    }}self.progress.completedUnitCount = totalBytesWritten;

使用tanh函数返回“百分比完整”值,使用kDefaultimageSize作为估计的基础,可以平滑地渐近逼近100%,这有点狡猾.

它并不完美,但它可以为完成百分比提供相当不错的代理.

总结

以上是内存溢出为你收集整理的在iphone中下载图像时,在UIProgressView中显示准确的进度全部内容,希望文章能够帮你解决在iphone中下载图像时,在UIProgressView中显示准确的进度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1068046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存