gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:30 25 4
gpt4 key购买 nike

我有四个包含图片的 url...我正在下载这些图像并将它们放入文档文件夹中..

这是我的代码..

-(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 sqlite
NSData *data2 = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)];//1.0f = 100% quality
[data2 writeToFile:jpegPath atomically:YES];

}

现在...我需要准确显示上述下载进度的 UIProgressView。

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

任何人都可以提供一些指导方针来实现这一点..

提前致谢...

最佳答案

我建议您使用一些异步下载技术(AFNetworking、SDWebImage,或者使用基于委托(delegate)的 NSURLSession 自己滚动)而不是 dataWithContentsOfURL 以便(a ) 你不阻塞主队列; (b) 您可以在下载过程中获得进度更新。

我还建议创建一个 NSProgress每次下载。当您的委托(delegate)方法获得有关已下载字节数的更新时,请更新 NSProgress 对象。

然后您可以将每个 NSProgressobservedProgress 相关联对于 UIProgressView ,并且当您更新 NSProgress 时,UI 可以自动更新。

或者,如果您和单个 UIProgressView 显示每次下载的所有 NSProgress 的总进度,您可以创建一个父级 NSProgress,将每个下载的 NSProgress 建立为父级 NSProgress 的子级,然后,随着每个下载更新其各自的 NSProgress,这将自动触发父 NSProgress 的计算。同样,您可以将父 NSProgress 绑定(bind)到主 UIProgressView,您将使用总进度自动更新 UI,只需让每个下载更新其单独的 NSProgress


不过,有一个技巧,因为某些 Web 服务不会通知您预期的字节数。他们将报告 NSURLResponseUnknownLength 的“预期字节数”,即 -1! (它这样做的逻辑原因可能超出了这个问题的范围。)这显然使得计算已下载的百分比变得困难。

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

  1. 您可以举手投降,只使用不确定的进度指示器;

  2. 您可以尝试更改请求,使网络服务报告有意义的“预期字节数”值(例如 https://stackoverflow.com/a/22352294/1271826 );或者

  3. 您可以使用“估计下载大小”来估计完成百分比。例如,如果您知道您的图像平均每张为 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 函数返回一个平滑渐近接近 100% 的“完成百分比”值,使用 kDefaultImageSize 作为估计的基础。

    它并不完美,但它产生了一个相当不错的完成百分比代理。

关于iphone - 在 iPhone 中下载图像时在 UIProgressView 中显示准确的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15433956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com